基于控制台的图书管理系统
核心需求:
用户能够登录到系统上。用户(User.java)分成两个角色:管理员(Admin.java),普通用户(NormalUser.java)。
管理员功能:
- 查阅某个书籍的信息。(FindOperation.java)
- 增加书籍。(AddOperation.java)
- 删除书籍。(DelOperation.java)
- 查看所有书籍列表。(DisplayOperation.java)
- 退出程序。(ExitOperation.java)
普通用户功能:
- 查阅某个书籍的信息。(FindOperation.java)
- 借阅书籍。(BorrowOperation.java)
- 归还书籍。(ReturnOperation.java)
- 退出程序。(ExitOperation.java)
首先创建一个User用户类,User 这个类用来作为Admin 管理员类和 NormalUser普通用户类的父类,其中存放两种角色的公共信息。User 类不应该被实例化,其 角色实际就只有管理员和普通用户两种,于是就做成一个抽象类, 防止后面不小心对 User 实例化了, 编译就能给出报错。
User.java
abstract public class User {
protected String name;
protected IOperation[] operations;
// menu()方法用来打印该用户的菜单,
// 不同的用户支持的操作不一样, 菜单内容也不一样,
// 此处就做成抽象方法, 再由该类的子类来进一步的重写这样的方法。
public abstract int menu();
public void doOperation(int choice, BookList bookList) {
// 如果 choice 是 1, 并且当前 user 是 Admin 的话,
// 此时取下标为 0 的元素, 就得到了一个 FindOperation 的实例,
// 此时 operation 这个引用指向的就是这个 FindOperation 实例,
IOperation operation = this.operations[choice - 1];
// 再调用 work 方法, 这也是父类引用调用方法, 实际执行的是 引用对应的子类的方法。
operation.work(bookList);
}
}
NormalUser.java
public class NormalUser extends User{
public NormalUser(String name){
this.name = name;
this.operations = new IOperation[] {
new FinOperation(),
new BorrowOperation(),
new ReturnOperation(),
new ExitOperation()
};
}
@Override
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("=========================");
System.out.println("请输入您的选择: ");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
Admin.java
public class Admin extends User {
/*
private String name;
//管理员能够支持的操作,这些操作存在于IOperation这个接口里面
//我们可以定义一个IOperation[]数组,因为我们知道接口无法实现实例化
//所以这个数组中放置的内容,就是实现了该接口类的实例。
//这里也能解释为什么我们要把若干个操作提取出共同信息,创建一个IOperation接口
//因为如果过不把这些操作类提取出共性搭建接口的话,在管理员类中就很难用过一个数组来描述管理员自身
//都支持哪些操作。
private IOperation[] operations;
*/
public Admin(String name){
this.name = name;
this.operations = new IOperation[] {
new FinOperation(),
new AddOperation(),
new DelOperation(),
new DisplayOperation(),
new ExitOperation()
};
}
@Override
public int menu() {
System.out.println("=========================");
System.out.println("Hello! " + name + ", 欢迎使用咱的图书管理系统");
System.out.println(" 1. 查阅书籍信息");
System.out.println(" 2. 新增书籍信息");
System.out.println