前言:图书管理系统是我们在学习编程方面常见的小项目,在学习完类和对象,封装,继承,多态和接口之后,我们就可以用这些思想来实现我们的图书管理系统,这里我会用三个博客来阐述具体实现方法。
均已写完,欢迎连续观看。
上篇我们根据业务需求,对整体框架和思想进行了阐述,创建好了所有的类,写完了book包里的两个类,这篇,我们主要写User包里的两个类和main类。
1.users包
usrs包里主要有三个类,User类作为PublicUser类和AdminUser类的父类,我们就可以运用多态的思想进行搭建。
1.1PublicUser类
首先由业务需求我们可以看到,不同的用户都有不同用户的菜单,首先我们应该提供一个普通用户的菜单,根据不同的选择进行不同的操作,这里我们定义一个choice用来接收用户的选择。
public int menu(){
System.out.println("===============普通用户菜单===============");
System.out.println("hello "+this.name+" 欢迎来到图书小练习!");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
System.out.println("=========================================");
System.out.println("请输入你的操作:");
Scanner sca=new Scanner(System.in);
int choice= sca.nextInt();
return choice;
}
注意:1.因为要返回选择的结果所以这里的返回值类型为int类型。
2.这里的name为用户的名称我们需要在User类中进行定义。
当然我们还要为他提供构造方法,首先由于他继承的User类,所以我们要用super对User类中name进行引用。
我们选择不同的用户就会有不同的操作,而我们的操作都实现了IOperation接口,因此这里我们定义一个IOperation[]类型的数组用来储存普通用户的所有操作,每个选择正好对应数组下标,这样一来,当我们选择普通用户,我们就在PublicUser类的构造方法中,初始化了他的所有操作,根据打印的菜单进行选择,选择对应数组下标就能实现相应对象的相应操作。
public PublicUser(String name) {
super(name);
this.iOperations=new IOperation[]{
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation()
};
}
注意:1.这里数组为IOperation[]类型,所以数组每一个元素为new一个相应操作的对象。
2.iOperations数组由于两个用户类都需要所以我们要在他们的父类User类中定义。
总代码:
public class PublicUser extends User{
public PublicUser(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("hello "+this.name+" 欢迎来到图书小练习!");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
System.out.println("=========================================");
System.out.println("请输入你的操作:");
Scanner sca=new Scanner(System.in);
int choice= sca.nextInt();
return choice;
}
}
1.2AdminUser类
和PublicUser类相同我们首先为他提供菜单方法。
public int menu(){
System.out.println("===============管理员菜单===============");
System.out.println("hello "+this.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 sca=new Scanner(System.in);
int choice= sca.nextInt();
return choice;
}
接着我们为他提供相应的构造方法。
public AdminUser(String name) {
super(name);
// 存储操作
this.iOperations=new IOperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DeleteOperation(),
new DisplayOperation()
};
}
与PubulicUser类相同,但是储存的操作是不同的。
注意:1.数组0下标应为退出系统,new ExitOperation()。
2.iOperations数组由于两个用户类都需要所以我们要在他们的父类User类中定义。
总代码:
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
// 存储操作
this.iOperations=new IOperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DeleteOperation(),
new DisplayOperation()
};
}
public int menu(){
System.out.println("===============管理员菜单===============");
System.out.println("hello "+this.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 sca=new Scanner(System.in);
int choice= sca.nextInt();
return choice;
}
}
1.3User类
User类作为PublicUser类和AdminUser类的父类,我们要提供我们需要的成员变量,也就是我们之前用到的iOperations数组和name。
protected IOperation[] iOperations;
protected String name;
我们在为他提供构造方法。
public User(String name) {
this.name = name;
}
由于两个子类中都有相应menu方法,所以父类中也要有menu方法,这样就能构成重写。
public abstract int menu();
注意:这里的menu方法没有具体实现所以menu方法要用abstract修饰构成变态方法。
有了两个子类,两个子类也有自己的菜单,储存了自己的操作,这里就需要提供一个用来执行不同操作的方法。
public void doOperation(int choice,BookList bookList){
this.iOperations[choice].work(bookList);
}
通过不同的menu方法,我们就可以拿到choice选择的结果,不同choice对应着不同的操作,所以就可以用choice来表示数组下标就可以访问到具体操作,我们在编写整体框架时,所有的操作都满足IOperation接口,每个操作都有相应类里的work方法实现,所以我们就只需调用他们的work方法就能实现根据你的选择来执行相应的操作。
总代码:
public abstract class User {
protected IOperation[] iOperations;
protected String name;
public User(String name) {
this.name = name;
}
public abstract int menu();
public void doOperation(int choice,BookList bookList){
this.iOperations[choice].work(bookList);
}
}
2.Main类
1.1main方法
main方法作为入口方法,我们的程序就是由此展开的。我们的一切工作都离不开BookList类,不管是我们的任何操作我们都离不开它,所以我们首先new一个BookList对象也就是书架。
BookList bookList=new BookList();
接着我们可以看到首先我们进入系统他会询问你的姓名身份,所以我们要提供一个登陆方法。
1.2login方法
public static User login(){
System.out.println("请输入姓名:");
Scanner scan=new Scanner(System.in);
String name=scan.nextLine();
System.out.println("请输入你的身份:1.管理员 0.普通用户");
int choice=scan.nextInt();
if(choice==1){
return new AdminUser(name);
}else {
return new PublicUser(name);
}
}
首先我们要提示它输入你的姓名,及身份,我们需要根据他的选择得到它是什么用户,所以我们就需要根据他的选择返回相应的对象,就达到了我们想要的结果。
注意:这里我们返回的是两个普通用户或者管理员的对象,所以我们要用他们的父类也就是User类型作为返回值。
接着我们回到main方法中,对login方法进行调用。
User user=login();
这里我们要用User类型接收。
通过这些操作,我们已经得到了你选择对象的引用,我们至于要用一个死循环,然后打印不同的menu菜单询问你的操作即可。
while(true) {
int choice = user.menu();
// 根据choice完成哪个对象的哪个操作
user.doOperation(choice, bookList);
}
这两行代码格外的重要,几乎体现了我们要练习的所有知识。首先我们调用user的menu方法,也就是我们刚拿到的管理员或者普通用户,因此我们根据user就可以调用到不同的menu方法拿到返回值choice。在调用我们刚在User类中写的doOpreation方法,也就是调用具体操作的方法。
总代码:
public class Main {
public static User login(){
System.out.println("请输入姓名:");
Scanner scan=new Scanner(System.in);
String name=scan.nextLine();
System.out.println("请输入你的身份:1.管理员 0.普通用户");
int choice=scan.nextInt();
if(choice==1){
return new AdminUser(name);
}else {
return new PublicUser(name);
}
}
public static void main(String[] args) {
BookList bookList=new BookList();
User user=login();
// user 1.管理员的对象 0.普通用户对象
while(true) {
int choice = user.menu();
// 根据choice完成哪个对象的哪个操作
user.doOperation(choice, bookList);
}
}
}
3.梳理一下
经过之前的一个博客,以及现在这个博客,我们已经可以做到,首先进入系统我们会调用login方法,询问你的名字,你的身份,根据你不同身份返回不同的对象,有了这个User类型的对象后,我们已经在其内部根据他们的构造方法,将所有的操作生成储存在了数组当中,我们在调用User中的menu方法,拿到你选择的是那个操作,返回choice,作为数组下标,根据你的doOperation方法调用具体的操作。至此所有的思路已经通顺,我们至于要将每个操作进行完善即可,我将在下个博客进行每个操作的实现。
执行效果:
这里打印出查找图书和借阅图书我们就可以知道进入了具体操作。