关于一个图书小系统的实现
这次是关于一个图书系统的实现,首先我们来看其基本功能
首先,这个图书系统可以区分你是图书管理人员,还是一个普通用户
此外根据选择的不同,我们可以选择不同的功能,选择管理人员我们得到的面板
选择学生我们得到的面板
首先我们来看其基本功能,比如说我们显示图书:>
或者是查找图书
接下来,我们通过代码来一步步具体实现:>
首先,既然是一个图书系统,那你总得有图书吧?,图书有姓名和作者等信息,因此我们可以创建一个图书类,来存放我们这些信息。
Book类
这里我们声明了5个成员变量,分别是我们的name,author,type,price,isBorrowed,分别来说明一本书的名字,作者,类型,价格,是否已被借出,这里我们的访问限定修饰符采用的private,以此来达到一种封装的效果。
此外,我们还需提供一个构造方法,来对图书进行初始化。
这里我们的构造方法中,没有我们的isBorrowed成员,是因为成员变量在不初始化的时候会有一个默认值,boolean类型的成员在不初始化的时候默认值为false,我们可以理解为未借出。
既然成员变量被我们的private修饰,我们应该相应的提供get and set 方法,来对这几个成员变量进行访问
这里就没什么好说的啦,(想要快速打出来可以用idea的快捷键)
接下来还有一步!,那就是重写我们的toString方法,以便我们后续对图书进行打印:
BookList类
现在既然已经有图书啦,那是不是还应该有一个书架来存放我们的书呢?这个时候,我们就创建了一个BookList类,来存放我的书,同时得到我们每一本书的信息
在BookList里面我们定义了一个Book类型的数组bookList,用来存放我们每一本书。 还有一个记录当前数组中存放了多少本书的usedSized。我们同样用的是private来修饰,来达到封装的效果:>
此外,我们还提供了一个无参的构造方法,先对bookList和usedSized进行初始化。
既然数组和usedSized被private 修饰,我们相应的也要提供get and set方法。
这里我们对数组bookList提供的get and set 方法, 针对于数组里面特定的某一本书,因此我们是对数组内进行操作, 就像第二个setPos, 我们有两个参数book 和pos , book是我们要存放的书, pos是我们要存放的书的下标。
对书架的一系列操作
既然书和书架都有了,接下来便是对书架进行一系列操作,我们将这些操作放在一个包中。
然后,我们将我们所要用到的操作都分为各个类,比如我们的增加图书操作,我们可以定义为一个AddOperation类, 比如我们的查找图书操作,我们可以定义为一个FindOperation类,我们按照这个思路,逐步走下去。
在这里,我们分别定义了7个类,增加,借阅,删除图书等等操作,现在我们来看其类中的内容(以我们的AddOperation为例)
这里我们写了一个work方法(里面具体的内容我们还没有实现),通过work方法我们来对增加一本图书,那其他操作,例如我们的FindOperation, ExitOperation等等操作,也可以通过一个work方法来实现,这样的话,我们就可以通过定义一个接口,来规范work当中的行为。
这样的话,所有的操作就都可以来实现这一个接口了。
举其中的一个类的例子:>
用户类
此外,有了我们的操作类之后,接下来我们的对象应该就是我们的使用者对象了吧?使用者又分为管理人员和学生,但它们从另一个角度上来说同时又是用户,因此,在此处我们将User设置为父类,将我们的管理人员-AdminUser,学生-NormalUser为其子类,因此,我们可以初步这样实现;
User类:>
Normal类
AdminUser类:>
这样我们就初步实现了这么一个用户类。
MainClass
接下来是我们的主函数实现部分,既然要进入一个图书系统,那我们肯定要先登录对吧?,因此我们首先写一个login方法
这里的login函数,我们通过选择的方式,来确定你的身份,同时返回一个管理人员或者学生对象,因为它们都为User类,此处其实发生了向上转型。
既然返回了一个子类对象,我们用User类型的变量去接收。我们想,接受了之后是不是应该打印相应的菜单?, 因此,我们可以在User类中添加一个menu函数,让子类对其进行重写,这样的话,就可以通过user调用对应的菜单啦!
这里的话我们写了一个menu函数,但我们又不想让它在User类具体写出它的内容,因此,我们可以把它设置为一个抽象方法,这样的话,User类也变成了一个抽象类:>
既然User成为了一个抽象类,那么AdminUser类和Normal类要重写父类的抽象方法:
AdminUser
NormalUser
这样的话,我们User类型的user引用,引用了子类对象后,就可以调用对应的menu方法.
这样的话,就可以显示相应的菜单了,但是这里的话,我们还差了一 步,那就是,要输入相应的操作。因此,我们还需要在menu函数里面做一些改动:>
我们这里将menu函数的返回值修改成为了int,这样的话就可以接收到这些操作
既然选择也做了,那么我们是不是应该考虑一下到底是谁调用了管理员还是学生所对应的方法呢?这里的话,有一个骚操作,那便是,我们在我们的User抽象类中定义一个接口数组。
但是在这里,我们并没有指明数组的指定大小,这是因为里面是为了存放我们的操作,而管理员的操作与学生的操作是不同的,因此,我们需要在Normal类和AdminUser类中对数组进行相应的初始化
Normal类
AdminUser类
这样的话我们得到了所对应的方法,接下来便是考虑一下谁调用了吧?,这里的话也有一个操作,那便是创建一个方法,来对其进行调用,接下来请看例子:>
**这里我们写了一个doOperaiton方法,既能保证是谁调用方法的同时,也能准确地知道是调用哪一个方法。**接下来,我们对MainClass类当中的主方法进行改造:>
这样的话,我们的主框架就已经写好了,接下来需要做的,那就是把我们对书架的操作进行具体化。
DisplayOperation
首先,我们将显示图书的操作进行具体化:.
这里的话我们首先得到了当前数组中元素的个数,并且通过我们的getPos(获取当前书架上的书),以此来进行打印,我们首先来看一下效果:>
这样就ok了。
ExitOperation
这里我们首先通过将书架置空来回收资源,其次再通过System.exit(),我们将其传入一个0,代表着程序正常退出。
DelOperation
在得到具体的删除方法前,我们先看一个例子:>
这样,就完成了我们的删除操作,接下来我们来看其具体代码:>
这里我们是首先通过输入图书的名字,以此来对书架中的名字进行匹配,然后:>
这里我们通过equals方法,一个一个来对书架中的名字进行比较,这样如果找到的话,我们就可以进行我们例子中的,以后一个数据取代前一个数据。接下来我们来看一下效果:>
成功删除!
FindOperation
接下来就是有一点点的复制粘贴,粘贴我们DelOperation类当中的方法的操作:>
如果找到我们想要借阅的图书的话,我们把其成员变量isBorrowed置为true即可,我们来看其效果:>
借出成功!
ReturnOperation
归还图书的操作,可以说是和借书的操作基本一模一样,只是我们需要把成员变量isBorrowed置为false即可
接下来我们来看一下效果:>
归还成功!
FindOperation
还是一阵子复制粘贴:>
接下来我们来看其效果:>
成功找到这本书的名字。
这样的话,我们的图书系统就大功告成了。贴出我的gitee首页,以下有该图书系统的源代码。