目录
整体思路
Book包
Book类
BookList类
user包
User类
NormalUser类
AdminUser管理员类
testmain包
opera包
IOPeration接口
普通用户
ExitOperation类
FindOperation类
BrrowOperation类
ReturnOperation类
管理员
AddOperation类
DelOperation类
ShowOperation类
总结
首先我们先来看一下我们要达到的效果
我们得有登录的姓名,与身份的选择
选择不同的身份对应不同的功能
比如选择管理员
选择普通用户
得有我们的图书
不会创建包的小伙伴可以去下方链接了解一下
【javaSE】面向对象程序三大特性之封装_遇事问春风乄的博客-CSDN博客https://blog.csdn.net/m0_71731682/article/details/132001012?spm=1001.2014.3001.5501
book包里面实现书类和书架类
opera包里我们用接口实现我们所需要在图书管理系统里实现的功能
testmain包里是我们的主函数所在
user包里用继承来实现我们所需要的管理者与借阅者类
实现所有类如下
接下来我会就每个里面的类进行讲解
在这个类实现的是我们图书该有的属性,与相应的构造方法,以及为了方便我们打印而重写的toString方法
代码实现如下
package book;
public class Book {
private String name;//书名
private String author;//作者
private int price;//价钱
private String type;//类型
private boolean isBorrowed;//是否被借阅
//构造方法
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
(isBorrowed?" 已借阅":" 未借阅")+
'}';
}
}
这里我们需要实现的有可以存放很多Book的数组
可以与增加、删除等功能的对应方法
代码实现
package book;
public class BookList {
//定义常量
private static final int DEFAULT_SIZE = 20;
//创建一个Book类型的数组,books里面存放的是多个book类型实例化的对象
private Book[] books = new Book[DEFAULT_SIZE];
//记录当前books数组当中 有多少本书?
private int usedSize;
public BookList() {
books[0] = new Book("剑来","烽火戏诸侯",88,"修仙小说") ;
books[1] = new Book("雪中悍刀行","烽火戏诸侯",66,"武侠小说");
books[2] = new Book("流浪地球","刘慈欣",99,"科幻小说");
books[3] = new Book("木苏里","某某",88,"爱情小说") ;
books[4] = new Book("天官赐福","墨香铜臭",66,"爱情小说");
books[5] = new Book("镇魂","priest",99,"爱情小说");
//表示最初是三本
this.usedSize = 6;
}
//读取这一本书
public Book getBooK(int pos) {
return this.books[pos];
}
//将该书写入该下标对应的位置,可以实现增加图书
public void setBook(Book book) {
this.books[usedSize] = book;
}
//后面会用于读取图书
public int getUsedSize() {
return usedSize;
}
//用于写入数组下标,与增加删除功能都有关系
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
}
这里的User类是作为NormalUser类与AdminUser类的父类
有相应的属性name与构造方法
会提供一个数组,供子类进行使用
有一个抽象类实现菜单
有一个方法会对用户选择后的结果进行传达,然后调用相对应功能的方法
实现代码
package user;
import book.BookList;
import opera.IOPeration;
public abstract class User {
protected String name;
protected IOPeration[] ioPerations;
public User(String name) {
this.name = name;
}
//创建一个抽象类,实现菜单
public abstract int menu();
//通过对象的相应调用与所传参数实现操作者选择的功能
public void doWork(int choice, BookList bookList) {
this.ioPerations[choice].work(bookList);
}
}
普通用户类,继承于User类
这里涉及一个数组,里面用于存放一些对象,来实现普通用户的功能
一个可以让用户选择的菜单,以及返回用户所做的选择
package user;
import opera.*;
import java.util.Scanner;
/**
* @Author 12629
* @Description:
*/
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
//对ioPerations数组进行初始化,里面放的是使用者所需要功能类的对象
ioPerations = new IOPeration[] {
//0.退出系统
new ExitOperation(),
//1.查找图书
new FindOperation(),
//2.借阅图书
new BrrowOperation(),
//3.归还图书
new ReturnOperation()
};
}
public int menu() {
System.out.println("****************************");
System.out.println("hello "+name+" 欢迎来到阳光图书馆");
System.out.println("1.查找图书!");
System.out.println("2.借阅图书!");
System.out.println("3.归还图书!");
System.out.println("0.退出系统!");
System.out.println("****************************");
System.out.println("请输入你的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
管理员类,继承于User类
这里涉及一个数组,里面用于存放一些对象,来实现管理员的功能
一个可以让管理员选择的菜单,以及返回管理员所做的选择
package user;
import opera.*;
import java.util.Scanner;
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
//对ioPerations数组进行初始化,里面放的是管理员所需要功能类的对象
ioPerations = new IOPeration[] {
//0.退出系统
new ExitOperation(),
//1、查找图书
new FindOperation(),
//2.新增图书
new AddOperation(),
//3.删除图书
new DelOperation(),
//4.显示图书
new ShowOperation()
};
}
public int menu() {
System.out.println("****************************");
System.out.println("hello "+name+" 欢迎来到阳光图书管");
System.out.println("1.查找图书!");
System.out.println("2.新增图书!");
System.out.println("3.删除图书!");
System.out.println("4.显示图书!");
System.out.println("0.退出系统!");
System.out.println("****************************");
System.out.println("请输入你的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
这里需要实现的是
可以根据用户选择不同的身份以及选择身份后所要进行的功能,调用相应的对象实现
代码实现
package testmain;
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
/**
* @Author 12629
* @Description:
*/
public class Main {
public static User login() {
System.out.println("请输入你的姓名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("请输入你的身份:1-》管理员 0-》普通用户");
int choice = scanner.nextInt();
if(choice == 1) {
return new AdminUser(name);
}else {
return new NormalUser(name);
}
}
public static void main(String[] args) {
BookList bookList = new BookList();
//返回来的值进行向上转型
User user = login();
while(true) {
//此处是一个简单的多态实现
int choice = user.menu();
//根据 choice 和 user 来确定 我到底 调用哪个对象的哪个操作
user.doWork(choice, bookList);
}
}
}
这个包利用接口来实现这些功能
会有一个work的抽象方法,参数类型为BookList的
代码实现
package opera;
import book.BookList;
public interface IOPeration {
void work(BookList bookList);
}
用于退出该系统
这里的实现很简单,使用System.exit(0);就好
import book.BookList;
public class ExitOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("退出系统!");
System.exit(0);
}
}
用于查找图书
根据书名对Books数组里面的每一Book类的名字进行比对
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements IOPeration{
@Override
public void work(BookList bookList) {
int currenSize = bookList.getUsedSize();
System.out.println("请输入要查找书的名字");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
for(int i = 0;i < currenSize;i++) {
Book book = bookList.getBooK(i);
if(book.getName().equals(input)){
System.out.println(book);
return;
}
}
System.out.println("查找书不存在");
}
}
实现借阅功能
根据书名进行遍历是否有该图书
判断该图书的状态
借阅后改变该图书的状态,改为已借阅
代码实现如下
import java.util.Scanner;
public class BrrowOperation implements IOPeration {
public void work(BookList bookList) {
System.out.println("借阅书籍!");
System.out.println("请输入你要借阅的图书的名字:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBooK(i);
if(name.equals(book.getName())) {
if(book.isBorrowed()) {
System.out.println("该书已经被借出! ");
}else {
book.setBorrowed(true);
System.out.println("借阅图书成功!");
}
return;
}
}
System.out.println("没有你要借阅的图书!");
}
}
归还图书
根据书名进行遍历是否有该图书
判断该图书的状态
归还后改变该图书的状态,改为未借阅
代码实现如下
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("归还图书!");
System.out.println("请输入你要归还的图书的名字:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currentSize = bookList.getUsedSize();;
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBooK(i);
if(name.equals(book.getName())) {
book.setBorrowed(true);
System.out.println("归还图书成功!");
return;
}
}
System.out.println("没有你要归还的图书!");
}
}
ExitOperation类与FindOperation类为两种身份共有的,这里就不再赘述
添加书籍
根据书名遍历该书是否已经存在
添加该书的所有属性
对Books数组进行更新,添加;这里就用到了我们前面在BookList里书写的方法,如下图
代码实现如下
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOPeration{
public void work(BookList bookList) {
int currenSize = bookList.getUsedSize();
System.out.println("新增图书!");
System.out.println("请输入你要新增的图书的名字:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for(int i = 0;i < currenSize;i++) {
Book book = bookList.getBooK(i);
if(book.getName().equals(name)){
System.out.println("所添加书籍已存在");
return;
}
}
System.out.println("请输入你要新增的图书的作者:");
String author = scanner.nextLine();
System.out.println("请输入你要新增的图书的价格:");
int price = scanner.nextInt();
scanner.nextLine();
System.out.println("请输入你要新增的图书的类型:");
String type = scanner.nextLine();
Book book = new Book(name,author,price,type);
//1. 获取到当前可以存放书的位置
int currentSize = bookList.getUsedSize();
//2. 把书放入指定位置
bookList.setBook(book);
//3. 书的有效个数+1
bookList.setUsedSize(currentSize+1);
System.out.println("添加成功");
}
}
删除书籍
根据书名遍历该书是否已经存在
寻找该书的数组下标,实现后面数组对前面的覆盖
现有图书数目减一,并将原来图书书目最后一位置为Null
代码实现
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOPeration{
public void work(BookList bookList) {
System.out.println("删除图书!");
System.out.println("请输入你要删除的图书:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
//1. 遍历数组当中 是否有你要删除的书 有记录下标
int index = -1;
int currentSize = bookList.getUsedSize();;
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBooK(i);
if(name.equals(book.getName())) {
index = i;
break;
}
}
//
if(index == -1) {
System.out.println("没有你要删除的书!");
return;
}
for (int i = index; i < currentSize-1 ; i++) {
//bookList[i] = bookList[i+1];
Book book = bookList.getBooK(i+1);
bookList.setBook(book);
}
//下标减一
bookList.setUsedSize(currentSize-1);
//每次删除 都要置空
bookList.setBook(null);
System.out.println("删除成功!");
}
}
显示图书
遍历Books数组
使用重写的toString方法就好
代码实现
package opera;
import book.BookList;
import java.sql.SQLOutput;
public class ShowOperation implements IOPeration{
@Override
public void work(BookList bookList) {
int currenSize = bookList.getUsedSize();
for(int i = 0;i < currenSize;i++) {
//我们重写了toString,所以这里会优先调用我们重写的toString方法
System.out.println(bookList.getBooK(i));
}
System.out.println("显示完毕");
}
}
关于《 图书管理系统》就讲解到这儿,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。想要完整包的小伙伴可以去到该博文的资源绑定进行下载,也可以私信博主