这次我将利用简单的java语法结合起来制作一个简易的图书管理系统,其中就主要包含身份的认证,不同身份在系统中不一样的功能的,以及各种功能的简单实现。
功能一:创建一个登录功能。
功能二:识别登录身份(管理员和普通用户两种),显示不同的菜单,从而选择功能
功能三:实现功能,管理员功能(1.查找图书,2.新增图书,3.删除图书,4.显示图书,0.退出系统) 普通用户功能(1.查找图书,2.借阅图书,3.归还图书,0.退出系统)
1.用户初始化
先将两种用户的身份进行初始化,先创建一个父类(User)用来设置他们的共同属性,在将不同用户用子类来设置不同功能
我这里只是简单的先构造框架,先进行用户名初始化。
2.书本的初始化
我们为了能借书或者还书,首先我们系统里就必须得先有书。那么我们就需要新建一个Book类来初始化需要到的书本,并在类里添加书的属性。
将书本进行封装,再用Generate将他们相关的方法生成出来。
接下来,我们将书本初始化好之后,就需要创建一个书架类,在这个类中就可以直接存放我们的书本,也就是对书本进行初始化。
3.系统功能的框架构造
我们将用户,还有书本的框架搭建好之后,就要对我们的功能进行构造框架,并且他们的功能都是用于我们的书架中BookShelf。所以我们需要再创建一个包来归类和构造系统中的功能。而各种功能我们就可以利用接口来实现功能,让所有的功能操作都来自于同一个规范的接口。
如此,我们也完成了系统功能的框架构造,剩下我们将一步一步完善各个部分的逻辑代码,并且将这三个部分整合起来,让我们的系统能开始跑起来。
4.完善登录系统
首先我们先制作一个简单的登录界面,不同的身份就要登录进入不同的功能中,为了能将不同身份加以区分,我们就要用代码去完善我们登录系统的功能
在这段Main方法的代码中,我们用login方法去创建简单的登录系统,并用User类来确定返回登录的身份,从而进入不同的功能菜单中,而菜单的代码逻辑,就要在我们两个身份中实现。首先我们要在父类中将menu()方法修饰成抽象方法,因为它在父类中不需要具体实现,只需要在两个子类中具体实现,所以我们的User类也要修饰成抽象类
这样我们就不需要if-else语句将他们写到一起,再去实现不同的菜单。
5.菜单中功能的选择
我们在完成身份识别之后,会进入到不同的菜单,既然进入了不同的菜单,那么我就会进行不同功能选择,那么我们该如何实现让用户可以选择功能呢!
首先在菜单出现后,必然是让用户选择功能,则我们的菜单就必须要有返回值,通过返回值从而知道功能的选取。所以我们的菜单就不能是void类型了,就要修改成int类型,子类与父类中的menu()方法都要进行修改。
而在Main函数中,我们需要接受menu()的返回值
到此,我们已经将该系统的大部分基础逻辑理清,接下来,我们就要进入到各种功能的逻辑代码实现。
6.功能的实现
功能的整合与操作
功能的整合
接下来我们要将系统中的所有功能用代码一一实现,但是在实现代码之前,功能是多种多样的,而且在返回choice时,也只是返回了一个数字,并不知道,系统并不知道我们要选择什么功能。此时,我们就需要将所有的功能先进行整合,所有我们就要先用数组整合,在通过数组下标的数字,就可以知道我们我们选择的是什么功能了。
我们现在User父类中声明用户要进行操作,但不进行初始化因为两种身份的功能不一样,我们可以直接在子类进行初始化我们不同身份的对应功能。
在子类中操作
将所有的功能都整合到一个数组使我们的菜单与功能一一对应。
功能的操作
我们将功能整合好之后,就需要将整合好的功能在被选择之后返回的choice来运行功能,而功能运行的对象是书架里的书,所以我们还需要再创建一个类来专门进入到数组中选择功能并让所选择的功能对书架进行操作。
所以我们要在User中加入
再Main中
这样再User中我们的this.iOperations[choice],可以直接选择到我们想要实现的功能,而后面的work(bookShelf),可以直接进行功能的实现了,因为我们在构造框架时,已经将所有的功能都规范好用work方法去实现所有的功能,我们只要通过IOperation接口中的work方法,就可以实现所有的功能。
功能的实现
增加图书
我将以比较简单的逻辑去完成这个功能,我们在这个系统中,本身就会在系统的BookShelf中初始化有一些书本,若我们想要增加新的书本,那我们默认把书放在数组中最后一个可以存放的位置(并不是最后一个位置!)。
我们要新增一本书,就是要将用户本身定义的书的属性,将其一一填写,创建一个新的book对象
我们创建好新的对象之后,下一步就是要把书放到数组中。而我们在创建BookShelf时,我们就定义好了num来表示书架中书的数量,所以我们可以直接根据这个num直接将书本放到对应的位置。
我们先在BookShelf中,写一个新的方法,通过接受数组下标,和书本信息,让我将书本放入
再回到我们的AddOperation中
定义一个currentSize来获得书架中目前一共有多少本书,在通过对象调用,将得到的num,和在AddOperation中新创建的book对象的信息放入到setbook中,这样就可以在书架中新增新的书本,新增完成后还有将书架中的num+1。
运行结果:
查找图书
在我们的书架BookShelf中,我们的书是像数组一样排列着的
所以我们想查找到我们需要的图书及其信息,就可以用for循环来根据数组下标来查找我们想要的图书,而BookShelf里的num就是记录着书的数量,我们就可以通过这个num来对我们的for循环有了限制条件,而每次在循环得到的下标,我们要通过引用对象回到BookShelf里找到对应的书本,所以我们还要在BookShelf中
以通过for循环中每一次循环的下标回到对象中找到对应的书。
我们想要将查找的书的信息打印出来,还要记得在book类中加入toString方法
所以我们要在FindOperation里实现这样
public class FindOperation implements IOperation{
@Override
public void work(BookShelf bookShelf) {
System.out.println("查找图书!");
System.out.println("请输入你要查找的图书:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currentSize = bookShelf.getNum();//记录当前书库还有多少本书
for (int i = 0; i < currentSize; i++) {
Book book = bookShelf.getBook(i);
if (book.getName().equals(name)){
System.out.println("找到了!");
System.out.println(book.toString());
return;
}
}
System.out.println("没有查到这本书!!");
}
}
用currentSize来接收BookShelf里的num,就可以开始循环,每次通过不同的i引用对象bookShelf中的不同的书,然后进行比较。
我们试着输入水浒传就可以得到运行结果
删除图书
删除图书,首先我们就要从书架中查找我们想要删除的图书是否存在,将输入的书名与书架中的书的书名进行对比进行判断,若没有则提示书库中没有这本书,若有这本书,就将着本书进行删除
删除之后,我们就要将所删除位置后面的书都向前挪一位,
当我们循环将后面的书挪动时,我们的循环最后只能循环到最后一本书的前一位,否则会造成数组越界
public void work(BookShelf bookShelf) {
System.out.println("删除图书!");
System.out.println("请输入要删除的图书名");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currentSize = bookShelf.getNum();
int i = 0;
int delIndex = -1;
for (; i < currentSize; i++) {
if (bookShelf.getBook(i).getName().equals(name)){
delIndex = i;
break;
}
}
if (delIndex == currentSize){
System.out.println("书库里没有这本书!");
return;
}
for (int j = delIndex; j < currentSize-1;j++){ //将对应图书成功删除后
Book book = bookShelf.getBook(j+1); //开始调整书本位置
bookShelf.setBook(j,book);
}
bookShelf.setBook(currentSize,null);
bookShelf.setNum(currentSize-1);
System.out.println("删除图书成功!!");
}
显示图书
显示图书,我们只需要在查找图书的逻辑中去掉对比选择的部分的代码就好
运行结果:
借阅与归还图书
因为此系统比较简单,我们只需要修改书本状态就可以知道是否借阅与归还书,借阅部分
public void work(BookShelf bookShelf) {
System.out.println("借阅图书!");
System.out.println("请输入你想要借阅的图书:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currentSize = bookShelf.getNum();
for (int i = 0; i < currentSize; i++) {
Book book = bookShelf.getBook(i);
if (book.getName().equals(name) && book.isBorrowed() == false){
book.setBorrowed(true);
System.out.println("该书本成功借出!");
return;
} else if (book.getName().equals(name) && book.isBorrowed() == true){
System.out.println("该书本未归还,无法借阅!");
return;
}
}
System.out.println("未查找到要借阅的书!");
}
归还部分
public void work(BookShelf bookShelf) {
System.out.println("归还图书!");
System.out.println("请输入你想要归还的图书:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currentSize = bookShelf.getNum();
for (int i = 0; i < currentSize; i++) {
Book book = bookShelf.getBook(i);
if (book.getName().equals(name) && book.isBorrowed()){
book.setBorrowed(false);
System.out.println("成功归还!!");
return;
}
}
}
退出系统
比较简单,我们在ExitOperation方法中
public void work(BookShelf bookShelf) {
System.out.println("退出系统!");
System.exit(0);
}
就可以了
总结
该系统主要是用于总结之前学过的抽象类,抽象方法以及接口等等知识点的一个实战,深化对java语言面向对象的特点的认识,慢慢感受面向对象的思想与思路。该系统逻辑是比较简单的,很明显很多特殊情况是无法处理。希望日后自己能多加努力学习,能做出一个更好的,最好是能用于实际应用的图书系统。