某日在逛b站的时候看到有人做出了图书馆管理系统,在仔细梳理自己以学过的java相关知识点后,发现还是能够实现的!
需要用到的相关知识点:向上转型,动态绑定,重写,继承,接口
在正式开始写图书馆管理系统前,先让我们康康这个图书馆管理系统的功能吧:
管理员用户:
普通用户:
通过上图的功能使用我们可以得知:
该图书馆管理系统是分为两种不同用户的,分别是管理员系统和用户系统,当我们输入自己的姓名后,通过选择数字1/0,来达到选择我们是管理员身份还是普通用户身份,以此来分别显示出不同的菜单来让我们选择不同的功能。可以大致分为下面4项步骤:
Ⅰ:输入姓名
Ⅱ:选择身份
Ⅲ:分别打印出对应身份的菜单并选择
Ⅳ:创造图书
Ⅴ:执行我们选择的功能
根据上面的分析,我们将接下来要编的代码分为以下三部分:①用户 ②图书 ③具体实现功能
在前面的分析过后,我们可以创建三个文件分别为 ①User ②Book ③Operation,并创建一个main类来将所有程序串联起来,如图:
在实现用户前,我们需要创建有一个父类User,然后创建其子类AdminUser和CommonUser,理由有以下两点:
①我们都知道用户是根据我们的选择来创造的,在我们未选择前是无法知道该用户是普通用户还是管理员用户,所以我们必须得先创建一个父类User,在我们选择了用户类型之后再创建对应的子类的管理员类型或是普通用户类型,然后再用父类通过动态绑定来实现对应功能。
②无论是管理员用户或是普通用户,他们肯定是都有名字滴~并且也有年龄性别啥的信息(不过在本博客中的程序只是将名字作为共性,其他期待大家来补充哇~),也就是说会有共同点出现,于是我们就可以用到继承的思想,来创建一个父类,将共同的都放入父类属性中,并让子类去使用。
User类中的代码:
AdminUser类中的代码:
CommonUser中的代码:
普通用户与管理用户在我们创建之后都会打印出对应的操作菜单,都有共同的这个功能,所以我们要在父类中先创建一个menu方法,但我们进一步思考会发现:其实当我们选择用户类型之后都是直接使用AdminUser的menu方法或者是CommonUser的menu方法,根本不需要用到User的menu方法,所以在这里,我们可以将User类变为抽象类,于是对应的AdminUser类与CommonUser类用到要将抽象方法menu重写,如下:
User中代码:
AdminUser中代码:
CommonUser中的代码:
这样我们就分别把管理员和普通用户的菜单都写好啦!可以在main类中来把这些都串联起来。
main类中的代码:
在完成以上代码后运行,我们已经可以打印出不同种类用户的菜单了~
对于书,首先是每本书都拥有自己的信息,如:书名、作者、借阅状态、价格;其次我们可以看到管理员与普通用户可以做到对书进行增删查改等一系列操作。要实现这两个方面,我们就需要创建两个类:一个是Book类,另一个是BookList类。我们可以用下图来理解Book类与BookList类的作用:
Book类中的代码:
在这一步我们先做到能够通过选择菜单的数字来调用对应功能先。
要实现各个功能,我们先将各个功能的类创建出来,根据之前我们的管理员菜单和普通用户菜单,可以创建出以下类,然后再创建一个接口:
这个接口是作为所有功能调用的一个总开关,我们先在接口中写下work函数,然后再在各个类implement此接口后再重写work函数,此时我们的目的只是为了能够实现调用功能,所以先将work函数都设置为返回类型为void的无参方法。
IOperation接口的代码:
SerchBook类的代码(其他类的代码相似):
首先我们要接收我们输入的功能数字,才能知道要执行什么功能,所以要将menu方法的返回值改为int型,这样才可以接收我们输入的功能选择。以下是我们新增加的代码。
User类中的代码:
AdminUser中的代码(CommonUser中的代码相似):
main类中的代码:
在这里我们需要用到接口数组,由于我们的各个操作类都有work这一方法,并且都统一继承了IOperation接口,也就是说每个此种类都有同一行为——work,通过调用接口,我们就可以调用其对应的方法。
User类中的代码:
补充:这里还要加多一行代码!!!!!
public abstract void work(int choice);
AdminUser中的代码:
CommonUser类中的代码:
main类中的代码:
在敲完上面代码后,我们就能够真正实现调用对应的方法了,测试一下~
我们知道,无论是管理员还是普通用户的操作,都是对图书的增、删、查、改等操作,二这些都是需要在外面创建的BookList类上进行操作的,只有真正拿到了BookList类,我们才可以通过BookList类来调用任一Book类进行操作。所以,要在我们调用对应的work方法时,也应该将BookList类作为参数传进去。
先将每个类中都先将BookList类作为参数放入,以便接下来完善操作:
User类:
AdminUser类(CommonUser类相同操作):
IOperation接口中的代码:
各个操作类中的代码(以AddBook类为例):
-------------------------------这个是个小小的分割线--------------------------------------
在传入了操作类中传入了BookList类后,我们终于可以开始针对各个操作类开始完善了:
在进行正式操作前,我们在前面的BookList类中将BookListSize的访问修饰符设置为了private类型,所以要写方法将BookListSize得到,并且我们可以先写两个方法:其中一个用来得到某位置图书,另一个方法用于放置指定位置的图书,如下:
BookList类中:
准备工作:
我们是通过输入书的名字来找到我们要删的书,所以在这里需要得到书的名字,于是在Book类中需要再加多一个方法使我们能够得到书的名字:
//在Book类中
public String getName() { //得到名字
return name;
}
public void setName(String name) { //设置该书的名字
this.name = name;
}
DeleBook类中的代码:
在写完上面的DeleBook类的代码后,我们其实可以发现其中的一部分代码是可以直接ctrl+c过来的(程序员的必备技能)
准备工作:
我们要借出这本书首先要先找到此书(可以借鉴前面的SerchBook类中的代码)。然后在找到我们的书以后我们需要得到该书的借阅状态,若为false则为未借阅,反之true则为已借阅。为了得到书的借阅状态,我们需要在Book类中加入下面代码:
//在Book类中
public void setPrice(double price) {
this.price = price;
}
public boolean isState() {
return state;
}
public void setState(boolean state) {
this.state = state;
}
BorrowBook类中的代码:
其实ReturnBook的代码实现思路与BorrowBook类是一样的,相信大家一定都有举一反三的聪明劲~就不作过多解释啦,可以自己先尝试理解或者结合上面的BorrowBook类来理解,一定会有很大收获的~
-------------------------------❗❗❗ 注意 ❗❗❗-------------------------------
为了让用户的体验更佳,我们在这里将Book类中的toString方法修改为以下代码,以此来增加用户体验:
@Override
public String toString() {
return "书名:" + name +
" 作者:" + author +
" 价格:" + price +
" 借阅状态:" + state();
}
private String state(){
if(this.state==true){
return "已借出";
}
return "未借出";
}
以上!便是全部的代码啦
又是收获满满的一天~