前言:该图书管理系统实现了查找、添加、删除、显示、借阅、归还等功能,分为两个用户群体:管理者和普通用户。使用了类与对象,封装继承多态,抽象类和接口等Java基础知识。
一.思路
面向对象三部曲:找对象,创建对象,使用对象。
1.找对象
图书馆管理系统中的对象有书和人。人通过一些方法操作书。操作方法是一个集合。
2.创建对象
这里可用使用包将它们整合在一起,人、书和功能各一个包。
书是一个类,还一个类是书架。书中是定义书的各种属性,书架是放书的地方,也是操作书的地方。
人分为两种,一种是管理员,一种是普通用户。创建一个父类将两人共有的属性放在这里,另外创建两个子类扩展父类。
功能这个包里放着各种各样我们实现的包,
3.脉络
public static void main(String[] args) {
BookList bookList=new BookList();//实例化书架,形象的理解为创建了一个图书馆
Person person=logic(); //判断这个人是哪一个类,是管理员还是普通用户
while(true){
int choice=person.menu();
person.doFunction(choice,bookList);
}
}
这是main方法的全部。
我们可以看到,我们先实例化了书架,相当于建立起了一个书架,我们可以在这个书架上对书进行操作。
第二步,通过一个logic方法判断出用户是哪一类。
书架有了,身份有了,接下来就是人对书架进行操作,也就是下面while循环里的内容。
二.框架的具体实现
1.logic方法的实现
先上代码:
public static Person logic(){
System.out.println("欢迎来的图书管理系统");
System.out.println("请输入您的姓名:");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
System.out.println("输入1:管理员 2:普通用户");
int choice=scanner.nextInt();
if(choice==1){
return new Manager(name);
}else{
return new Normal(name);
}
}
返回值是我们定义的父类Person。通过输入的选择,用if分出两种情况(这里不是很严谨,没有判别输入其他数字的情况),直接new一个对象返回,new完类也实例化完了。
这样我们就得到了我们要用户身份。
2.person.menu方法的实现
person现在是某一个具体的身份,可以调用其类里的menu方法。
//普通用户
public int menu(){
System.out.println("普通用户界面");
System.out.println("1:查阅图书");
System.out.println("2:借阅图书");
System.out.println("3:归还图书");
System.out.println("0.退出系统");
System.out.println("请输入你的操作:");
Scanner scanner=new Scanner(System.in);
int choice= scanner.nextInt();
return choice;
}
//管理员
public int menu(){
System.out.println("管理员界面");
System.out.println("1:查阅图书");
System.out.println("2:新增图书");
System.out.println("3:删除图书");
System.out.println("4:显示图书");
System.out.println("0.退出系统");
System.out.println("请输入你的操作:");
Scanner scanner=new Scanner(System.in);
int choice= scanner.nextInt();
return choice;
}
通过输入数字来选择我们要进行的操作,并将刚输入的数字作为返回值去返回。
获得具体数字后我们可以进行下面的操作来进行具体的实现。
3.person.doFunction方法的实现
public IFunction[] iFunctions;
public void doFunction(int choice, BookList bookList){
iFunctions[choice].work(bookList);
}
这是Person类中的内容,可以看到我们先定义了一个接口数组,使用了这个接口中的某一个方法。在一开始实例化两种用户时我们就用构造方法来实现了数组的“赋值”:
//普通用户
public Normal(String name) {
super(name);
this.iFunctions = new IFunction[]{
new Exit(),
new Seek(),
new Borrow(),
new Back()
};
}
//管理员
public Manager(String name) {
super(name);
this.iFunctions=new IFunction[]{
new Exit(),
new Seek(),
new Add(),
new Del(),
new Show()
};
}
这里的顺序对应了menu方法里的顺序,大家可以去上面查看。
4.接口的实现
public interface IFunction {
void work(BookList bookList);
}
在接口里写了一个work方法,这个就是上面调用的方法。参数是书架,目的是为了操作书架。
三.功能的具体实现
0.前置内容
每一个具体的功能都通过接口连上了IFunction,都要再次实现work方法
iFunctions[choice].work(bookList);
另外在书架上定义一个int变量来记录书的数量
int size = 0;
1.查阅图书
public void work(BookList bookList) {
System.out.println("查找图书");
System.out.println("请输入想要查找书的名称:");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
int size=bookList.getSize(); //利用BookList类的方法来获得书架上书的数量
for(int i=0;i<size;i++){
String bname=bookList.getname(i);
if(bname.equals(name)){ //比较字符串
System.out.println("书找到了");
return ;
}
}
System.out.println("没有这本书");
}
bookList.getSize()这个方法是获取现在书架上书的数量,然后进入循环去寻找是否有这本书,比较简单。
2.借阅图书
public void work(BookList bookList) {
System.out.println("借阅图书");
System.out.println("输入要借阅书的名称:");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
int choice=bookList.getSize();
for(int i=0;i<choice;i++){
String bname= bookList.getname(i);
if(bname.equals(name)){
bookList.changeType(i,true); //用人方法要说哪一个
bookList.changeSize(-1);
System.out.println("借阅成功");
return ;
}
}
System.out.println("没有这本书无法借阅");
}
借阅图书要实现的细节:
1.把书的属性设置为已借出;2.书架上书的数量减一。
3.归还图书
public void work(BookList bookList) {
System.out.println("归还图书");
System.out.println("输入要归还书的名称:");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
int choice=bookList.getSize();
for(int i=0;i<choice;i++){
String bname= bookList.getname(i);
if(bname.equals(name)){
bookList.changeType(i,false); //用人方法要说哪一个
bookList.changeSize(1);
System.out.println("归还成功");
return ;
}
}
System.out.println("没有这本书无法归还");
}
细节方面与上面的借阅相反。
4.新增图书
public void work(BookList bookList) {
System.out.println("添加书籍");
int choice=bookList.getSize();
if(choice==10){
System.out.println("书架已满无法继续添加");
return;
}
Scanner scanner=new Scanner(System.in);
System.out.println("请输入新增书的名称:");
String name=scanner.nextLine();
System.out.println("请输入新增书的作者:");
String author=scanner.nextLine();
System.out.println("请输入新增书的类型:");
String type=scanner.nextLine();
System.out.println("请输入新增书的价格:");
int price=scanner.nextInt();
Book newbook=new Book(name,author,price,type);
for (int i = 0; i < choice; i++) {
String name2=bookList.getname(i);
if(newbook.equals(name2)){
System.out.println("书架上已经有这本书了");
return ;
}
}
bookList.setBooks(choice,newbook);
bookList.setSize(choice+1);
System.out.println("添加成功");
}
5.删除图书
public void work(BookList bookList) {
System.out.println("删除书籍");
Scanner scanner=new Scanner(System.in);
System.out.println("输入要删除的书的名称");
String name=scanner.nextLine();
int choice=bookList.getSize();
int i = 0;
int flag=-1;
for (; i < choice; i++) {
String bname=bookList.getname(i);
if(bname.equals(name)){
flag=i;
break;
}
}
if(i==choice){
System.out.println("没有这本书");
return ;
}
for (int j = flag; j < choice-1; j++) {
Book book = bookList.getBooks(j+1);
bookList.setBooks(j,book);
}
bookList.setBooks(choice-1,null);
bookList.setSize(choice-1);
System.out.println("删除成功");
}
6.退出系统
public void work(BookList bookList) {
System.out.println("成功退出系统");
System.exit(0);
}
四.总结
以上功能的实现不是最主要的,代码的框架是最主要的。怎么实现一个图书管理系统,它的整个脉络是怎样的,这是重要的。上述功能代码的实现可能有不严谨的地方,大家可以自行修改。