图书管理系统Part2(封装,继承,多态,接口的练习)

本文档介绍了如何使用面向对象编程思想构建图书管理系统的用户类,包括公共用户和管理员用户,以及它们各自的操作菜单。用户类作为父类包含操作数组和名称属性,子类则根据用户类型定义不同的菜单和操作。在主类中,通过login方法获取用户对象,并通过循环调用menu和doOperation方法执行用户选择的操作。
摘要由CSDN通过智能技术生成

前言:图书管理系统是我们在学习编程方面常见的小项目,在学习完类和对象,封装,继承,多态和接口之后,我们就可以用这些思想来实现我们的图书管理系统,这里我会用三个博客来阐述具体实现方法。

博客链接:1.第一篇 part1    2.第三篇 part3

均已写完,欢迎连续观看。

上篇我们根据业务需求,对整体框架和思想进行了阐述,创建好了所有的类,写完了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方法调用具体的操作。至此所有的思路已经通顺,我们至于要将每个操作进行完善即可,我将在下个博客进行每个操作的实现。

执行效果:

 这里打印出查找图书和借阅图书我们就可以知道进入了具体操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿拉蕾wjh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值