又进行了一段时间的学习,经过反复推敲+代码调试,想上手做个图书管理系统巩固一下所学知识~欢迎大家跟我一起学习巩固呀~
自己的逻辑实现流程:
理出所涉及的对象和接口-->需要哪些对象属性-->对应对象和接口的功能实现 (画出思维导图)
普通用户对应的能执行的操作:查找图书,借阅图书,归还图书,退出图书系统。
图书管理员对应能执行的操作:新增图书,删除图书,查找图书,显示图书,退出图书系统。
1) 首先,为方便管理,我们建立三个包分别存储图书管理系统的操作对象,用户及各种操作。如图:
2) 抽取对象之间的共性创建父类或者基本接口,并将对应所需要的属性及构造方法定义出来。普通用户和图书管理员都有姓名,各种操作都是基于书架,但是实现方式不同。
注:如果成员变量用private修饰,如果要访问它们,需要给外部提供set和get方法去访问它们哟!因为会导致图显冗余,所以这里我就不在图中显示它们了~
如图:
操作对象:
用户:
各种操作:
各种具体操作都可实现IOperation接口去重写其operate方法完成各自对书架上书的操作(动态绑定)
这里以新增图书这个操作为例,其它操作一样要实现IOperation接口并重写operate方法:
最后完成准备工作(这里我们新增Test去测试实现效果):
开始测试1内容:书架中的书是否完成初始化:
初始化成功!
开始测试2内容:测试各种操作能否完成重写:
全部完成重写! 继续~
3) 测试类中的具体逻辑:用户登录--->打印菜单--->用户选择对应的操作--->执行操作
● 首先,让用户选择以什么身份(0:普通用户 1:图书管理员) 登录(登录功能):
● 其次,打印菜单前,先准备菜单(两种用户都具备菜单的功能,但是打印内容不同,我们可以通过继承抽象类重写其抽象方法的逻辑去实现):
则让User的两个子类都重写printMenu()方法就能打印不同的菜单啦!
我们来测试一下是否能正常登陆并打印出不同菜单~
打印普通用户的菜单:
打印图书管理员的菜单:
测试成功~
● 为了让用户选择对应的操作,所以我们需要在两种用户中定义存放各自操作的数组并且将数组下标和用户输入的值对应起来方便执行操作。
在main函数中得到操作数组并通过用户输入的操作数执行对应的操作:
没错又该测试啦~
普通用户:
图书管理员:
这样我们的整个大概框架就完成啦~撒花✿✿✿
在前面我们已经完成了类和接口和大概的逻辑准备,只差对应操作的具体实现啦~
为了方便测试,我们可以在Book类中重写toString方法,方便打印。
● 新增图书操作实现
测试一下(在新增图书后,打印书架中的每一本书)~
添加成功~(这些数据都是在内存中哦!程序运行完成后会销毁,并不具有持久性)
● 删除图书操作实现
首先得确认用户要删除的书在书架中,所以我们得在书架中根据用户输入的书名查找到用户要删除的书:
如果存在则返回目标书的下标,否则返回-1(不存在)。如果存在,则从当前返回的下标位置开始,将后面的书从后往前挪动一位,则返回的下标位置的书籍会被覆盖(类比于数据结构中删除顺序表某一位置的元素)。
最后将最后一个重复的书赋空并将当前书架中的书数量-1:
测试一下~
● 查找图书操作实现
查找其实在删除操作中实现完毕了,根据书名查找对应书籍(遍历-->比较-->成功返回下标,否则返回-1)
测试效果:
测试查找操作成功!
● 显示图书操作实现
这个逻辑也不复杂,直接遍历打印书架上的书就好了
测试运行:
● 借阅图书操作实现
借阅是在Book的isBorrowed为false(未被借阅)的情况下改为true(找到图书--->判断该图书是否被借阅--->更改isBorrowed属性值)
● 归还图书操作实现
而归还是在Book的isBorrowed为true(被借阅)的情况下改为false(找到图书--->判断该图书是否被借阅--->更改isBorrowed属性值)
测试运行:
测试归还操作成功!
● 退出图书系统操作实现
我们直接使用System.exit()方法退出程序,参数为status值(非零为非正常退出程序,0为正常退出程序)。
测试运行:
测试退出图书系统操作成功!