3.5 ExitOperation 类-退出系统
package operation; import book.BookList; public class ExitOperation implements IOPeration{ @Override public void work(BookList bookList) { System.out.println("退出系统!"); System.exit(0); } }
4. 创建 user 包
用来维护使用者。对于该系统来讲,使用者有管理员和普通用户,所以在 user 包中我们分别建立用户类(User)、管理员类(AdminUser)和普通用户类(NormUser)。
User用来存放和声明AdminUser和NormUser两类中相同的一些属性与方法,而不同的方法分别在各类中进行重写即可,比如:两者的使用时所显示的菜单以及各自所调用的一些功能。
4.1 User 类
管理员和用户在进行系统操作时,会有一些相同的操作,在User类中就会实现他们之间共有的属性与方法。
先在User类中先定义一个name成员:
package user; public abstract class User { protected String name;//只能User包中的子类访问 //构造方法 public User(String name) { this.name = name; } public abstract int menu();//声明menu方法,没有具体实现的抽象方法 }
创建doOperation方法,用来调用用户需要进行的操作:
public void doOperation(int choice, BookList bookList){ ioPerations[choice].work(bookList); }
整合代码:
package user; import book.BookList; import operation.IOPeration; public abstract class User { protected String name;//只能同一个包中的子类访问 protected IOPeration[] ioPerations; //构造方法 public User(String name) { this.name = name; } public abstract int menu();//声明menu方法,没有具体实现的抽象方法 public void doOperation(int choice, BookList bookList){ ioPerations[choice].work(bookList); } }
4.2 NormUser 类
与AsminUser相同的一些操作已经在User类中说明,所以这里只需继承父类(User)即可:
public class NormalUser extends User{ //帮助父类进行构造,对父类中的name成员进行初始化 public NormalUser(String name) { super(name); }; }
设计用户菜单:
在每次打印完菜单后,提醒用户输入所需操作对应的数字,并返回对应操作数。
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); System.out.println("请输入你的操作:"); int choice = scanner.nextInt(); return choice; }
因为继承了User类,需要帮助父类初始化ioPerations,所以在该数组中存入属于普通用户的操作,且放入顺序与对应的操作数字一致:
this.ioPerations=new IOPeration[]{ new ExitOperation(), new FindOperation(), new BorrowOperation(), new ReturnOperation() };
整合代码:
package user; import operation.*; import java.util.Scanner; public class NormalUser extends User{ public NormalUser(String name) { super(name); this.ioPerations=new IOPeration[]{ new ExitOperation(), new FindOperation(), new BorrowOperation(), new ReturnOperation() }; } 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); System.out.println("请输入你的操作:"); int choice = scanner.nextInt(); return choice; } }
4.3 AdminUser 类
继承User类:
public class AdminUser extends User{ //帮助父类进行构造,对父类中的name成员进行初始化 public AdminUser(String name) { super(name); }; }
6
设计管理者菜单:
提醒管理员输入所需操作对应的数字,并返回对应操作数。
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); System.out.println("请输入你的操作:"); int choice = scanner.nextInt(); return choice; }
初始化父类ioPerations:
this.ioPerations=new IOPeration[]{ new ExitOperation(), new FindOperation(), new BorrowOperation(), new ReturnOperation() };
整合代码:
package user; import operation.*; import java.util.Scanner; public class NormalUser extends User{ public NormalUser(String name) { super(name); this.ioPerations=new IOPeration[]{ new ExitOperation(), new FindOperation(), new BorrowOperation(), new ReturnOperation() }; } 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); System.out.println("请输入你的操作:"); int choice = scanner.nextInt(); return choice; } }
5. 建立 Main 类
Main类的作用:联合三个包中的方法实现程序运行。
设置一个用户登录界面。先输入使用者的姓名,然后选择自己的身份(1–>管理员 2–>普通用户),通过所选数字的不同,使系统调用两类用户各自所属的方法。
import user.AdminUser; import user.NormalUser; import user.User; import java.util.Scanner; public class Main { public static User login(){ 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 AdminUser(name); }else{ //普通用户 return new NormalUser(name); } } public static void main(String[] args) { User user=login();//向上转型,user指向哪个对象要看返回值是什么 int choice=user.menu();//动态绑定,要通过user调用menu方法,就要在User先声明。并用choice接收返回的操作数 } }
根据上述choice的值可以选择调用哪个方法,因此我们创建一个 doOperation 方法来调用用户想要执行的操作:
BookList bookList=new BookList(); user.doOperation(choice,bookList);
整合代码:
import book.BookList; import user.AdminUser; import user.NormalUser; import user.User; import java.util.Scanner; public class Main { public static User login(){ 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 AdminUser(name); }else{ //普通用户 return new NormalUser(name); } } public static void main(String[] args) { User user=login();//向上转型,user指向哪个对象要看返回值是什么 //根据choice选择来调用哪个方法 BookList bookList=new BookList(); while(true) { int choice = user.menu();//动态绑定,要通过user调用menu方法,就要在User先声明。并用choice接收返回的操作数 user.doOperation(choice, bookList); } } }