[Java] 自己写图书馆管理系统(详细版)

目录

一、简介

二、需求

三、具体设计

一、大纲

二、分析过程

三、小结

1.整体流程

2.ListBookOrderByXXXCommand

3.匿名类对象语法知识点

4.类和对象(面向对象设计)

四、完整代码


一、简介


实现一个简单的能对图书馆的书籍进行简单管理的一个系统。所用到的知识有:类,抽象类,封装,继承,多态,接口。(基础知识的学习可看我博客的其他文章~)

二、需求


1.用户登录

2.管理员角色(增加书籍 、查阅书籍(根据书名排序、根据价格排序、根据借阅情况排序) 、删除书籍 、打印书籍列表

3.普通用户角色(查询书籍 、借阅书籍 、归还书籍

都在命令行上完成操作

三、具体设计


一、大纲

1.从持久化存储中(文件)加载书籍信息 -> 以顺序表的形式进行呈现

2.用户登录 -> User对象(多态体现)
3.进入一个循环中
        3.1打印用户角色对应的菜单,并且让用户选择

        3.2根据用户的选择,以Executable 对象来体现(多态),执行对应的操作命令(方法最终的执行是由对象类型决定的,对象不同,执行方法不同)
4.用户退出(Ctrl + D),打印退出信息

二、分析过程

1.输入过程需要处理很多事情:①打印提示信息②读取用户输入③用户有没有按 ctrl + D 退出,因此我们直接封装一个对象去处理输入问题。

Input input = new Input();

2.在用户登录中,我们需要一个用户管理的对象,由该对象完成用户登录的具体操作:①要求用户输入②判断用户角色。

 UserStorage userStorage = new UserStorage();User user = userStorage.login(input);

3.在打印用户菜单中,我们需要一个接口,可以返回给我们一个可以执行的命令,从输入中打印菜单并且进行用户选择。

IExecutable command = input.menuAndSelect();      //这是一个命令
command.excute(user,input);     //去执行

4.因为我们要写的类很多,所以根据他们不同的职责,进行分类,比如:新建一个输入包把输入的类(Input)放在里面。新建一个用户包,把用户的类(User、UserStorage)放在里面。新建一个命令包,把命令的接口放在里面。

 

5.写 login

①先让用户输入用户名 ② 根据用户名,角色是管理员还是普通用户 ③ 根据不同角色,创建不同用户,输入时,写成带有提示的输入(prompt)。

6.在Input 类中完成prompt。

7.我们提前定义好一些用户名,作为管理员。

8.完成IExecutable 接口,里面实现 excute 方法。 

9.完成menuAndSelect()方法,首先要显示菜单,角色不同,拥有的功能不同,因此需要用户信息,把User user 传入。同时menuAndSelect()方法中的showMenu();方法也要实现,首先需要得到这个角色支持哪些命令(以IExecutable[ ] 数组的方式来体现)

    public IExecutable menuAndSelect(User user) {showMenu(user); //角色不同,拥有的功能不同,因此需要用户信息}private void showMenu(User user) {//1.得到角色支持的命令IExecutable[] supportedCommands = user.getSupportedCommands();//2.遍历并打印每个命令的名称,显示操作菜单for(int i = 0;i < supportedCommands.length;i++){IExecutable command = supportedCommands[i];System.out.printf("    %2d. %s\n",command.getName());}}

10.想要增加几个命令,就多写几个 command 利用接口、抽象类 + 继承等实现了多态的效果,使得开发的过程变得简单。(分为管理员用户 和 普通用户)

11.具体的实现,添加书籍:1.让用户输入要添加的书籍 input.prompt()        2.使用用户输入信息,构造成书籍对象Book(name、author、type、price、borrowedBy)     

public class Book {public String name;public String author;public String type;public int price;public String borrowedBy;   // 如果没人借走,就是null
}

  3.把书籍对象添加到类似 BookStorage(书架)对象上。将书籍尾插到书架上

public class BookStorage {private Book[] array;private int size;public BookStorage(){array = new Book[20];size = 0;}//尾插public void add(Book book){//1.确保容量够用ensureCapacity();array[size++] = book;}private void ensureCapacity(){if(size < array.length){//说明至少还可以放一个元素,容量够用return;}//否则进行扩容array = Arrays.copyOf(array,array.length * 2);}
}

书架对象只有一个,书籍对象有很多个。所以两者之间的关系是容器与元素的关系。把书架抽象成关于书籍的顺序表。

12.实现所有的 command 内容,根据需要也可以添加 command 的内容

13.书籍的格式化:职责归属放到Book.toString()

比较:书籍默认按照名称比较(自然顺序),如果需要其他比较,则使用外部比较器

14.功能实现完成之后,先以管理员的身份运行程序,添加书籍,退出;再以普通用户身份运行程序,借阅书籍;发现普通用户中没有书籍 。如何解决?

借助可以在多进程中共享的存储,这个存储还具有持久化(进程退出后,数据仍然保存)。这个共享的存储就是硬盘:想办法把数据放到硬盘上,硬盘上的数据,被操作系统抽象成一个个文件,我们只需要把数据写到文件中即可

具体实现:1.程序启动时,从文件中(指定一个路径)读取所有的书籍信息,读到内存中(以BookStorage 对象中 Book 的形式体现)

2.凡是对BookStorage 做改动,我们都需要把数据,写一份到文件中(指定路径)

3.规定格式:思考一个Book对象在文件中长什么样?

        暂且规定:每行一本书,书的属性之间用一个特殊字符(@)分割。这个成立的前提是,书名,作者名,类型名,借阅人的字符中不能出现 \n 和 @,否则不知道怎么去解读了。字符集编码必须是UTF-8。

三、小结

1.整体流程

从持久化存储中(文件)加载书籍信息 -> 以顺序表的形式进行呈现

通过用户登录 -> 当前登录用户对象(管理员用户 or 普通用户)

循环{

        根据不同的角色用户,显示不同的操作菜单(靠多态机制  <-  抽象类、继承、引用指向等等这些语法知识点一起来实现)

        让用户选择具体的操作 ->  得到当前要指向的命令

        执行命令,根据命令不同,执行不同的操作(靠多态机制 <- 接口、继承、引用指向等等这些语法知识点一起来实现)

}

对于我们input 对象来说,由于在用户登录、用户选择命令、执行命令时都要用到input 对象,因此,①从性能角度来说,没必要每个地方都建立一个独立的input 对象 ②有时候在代码的不同位置,需要共享一些信息的时候。所以我们有一个公共的input 对象就够了,别人只负责去使用就好了。我们的Input 对象,全局只有一个;User 对象(当前登录用户),全局只有一个BookStorage 对象(图书管理系统的书架)全局只有一个。

2.ListBookOrderByXXXCommand

①模板设计模式:父类(抽象类)实现了 execute 方法:使用操作的模板       

        a.获取外部比较器对象   (留给子类们去实现)

        b.获取所有书籍信息

        c.根据比较依据排序

        d.展示列表

多态 为 模板设计模式 提供了底层服务(没有多态,就做不到 模板设计模式)

        抽象类、继承、方法的重写、引用的指向等语法基础,为实现多态,提供了底层服务

②深入应用了对象的比较 Comparable or Comparator

③代码风格       printBook的代码全部抽象到 Book.toString 中,从面向对象的角度来讲,职责封装更合理。这些代码语句,放到哪里都能执行,但是放到合适的类、合适的方法中,让程序员看起来,层次分明,层次划分的更清楚(封装概念的体现)

④属性对象逃逸(逃逸有风险)

3.匿名类对象语法知识点

public class ListBookOrderByBorrowedCommand extends AbsListBookCommand{private static class BorrowedComparator implements Comparator{@Overridepublic int compare(Object o1, Object o2) {Book b1 = (Book) o1;Book b2 = (Book) o2;int br1 = b1.borrowedBy == null ? 0 : 1;int br2 = b2.borrowedBy == null ? 0 : 1;return br1 - br2;  //没被借走的比较小,在上面,被借走的在下面}}private final Comparator comparator = new BorrowedComparator();

BorrowedComparator类,这个类,只使用了一次,创建了一个comparator对象。理论上,再也不会用到这个类了。可以用匿名类对象的语法替换,好处:1.不用再花心思为类起名字了。2.从语法角度,保证了确实没有其他地方用到这个类了。3.代码可以短一点。

改进后:

public class ListBookOrderByBorrowedCommand extends AbsListBookCommand{private final Comparator comparator = new Comparator() {@Overridepublic int compare(Object o1, Object o2) {Book b1 = (Book) o1;Book b2 = (Book) o2;int br1 = b1.borrowedBy == null ? 0 : 1;int br2 = b2.borrowedBy == null ? 0 : 1;return br1 - br2;  //没被借走的比较小,在上面,被借走的在下面}};

new 父类( ... ) { }; ①定义一个类(没有名字,所以称为匿名类),这个类继承(实现)了父类。②直接用这个类实例化一个对象出来。

4.类和对象(面向对象设计)

输入对象(Input)                          整个应用只需要一份

用户存储对象(UserStorage)       整个应用只需要一份

当前登录用户对象(User:AdminUser、CommonUser   也可以添加其他的对象)     整个应用只需要一份

书架管理对象(BookStorage)       整个应用只需要一份

书籍管理对象(Book)                    用到的时候创建

命令对象(实现了 IExecutable 的很多 XXXCommand 对象)           理论上:整个应用只需要一份,每个用户子类中独立一份 

四、完整代码


 详情请看

零七/图书馆管理系统 - Gitee.comhttps://gitee.com/hlingqi/library-management-system/tree/master/out/production/%E5%9B%BE%E4%B9%A6%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9FIDEA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34157.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

周易名:传统周易结合现代人工智能起名字

ChatGPT是由OpenAI公司开发的一种自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;它是一种基于Transformer架构的深度学习模型。GPT的全称是Generative Pre-trained Transformer&#xff0c;也就是基于预训练的生成式Transformer模型。 ChatGPT被训练在大规模的文本…

【AIGC】人工智能的新篇章:生成式人工智能对企业的影响和意义

目录 人工智能的新篇章:生成式人工智能对企业的影响和意义

关于计算机网络的好坏处的英语作文,网购的好处和坏处英语作文带翻译

010在线为您甄选多篇描写网购的好处和坏处英语作文带翻译,网购的好处和坏处英语作文带翻译精选,网购的好处和坏处英语作文带翻译大全&#xff0c;有议论&#xff0c;叙事 &#xff0c;想象等形式。文章字数有400字、600字、800字....缓存时间&#xff1a; 2021-07-09 We talked…

计算机的利与弊英语作文带翻译,手机的利与弊带翻译英语作文(通用5篇)

手机的利与弊带翻译英语作文(通用5篇) 在学习、工作、生活中&#xff0c;许多人都有过写作文的经历&#xff0c;对作文都不陌生吧&#xff0c;借助作文人们可以实现文化交流的目的。为了让您在写作文时更加简单方便&#xff0c;下面是小编精心整理的手机的利与弊带翻译英语作文…

太厉害了,竟然用 Python 给英语老师开发了个英语作文批改的神器

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 原创&#xff1a;TrueDei 想要获取更多Python学习资料了解更多关于Python的知识可以加Q群630390733踊跃发言大家一起来学习讨论吧&#xff01; 由一个家长退群的故事在某…

基于Android的网上订餐系统

网上订餐系统大家肯定都不会陌生&#xff0c;那就废话不多说&#xff0c;直接上干货。 本人大二&#xff0c;刚好这学期需要做Android应用开发的大作业&#xff0c;今天也是刚刚做完演示&#xff0c;想着留着代码可能也不会有什么太大的用处了&#xff0c;就分享出来供大家参考…

完整的外卖系统,手机端 + 后台管理(附源码)

点击上方“逆锋起笔”&#xff0c;公众号回复 编程资源 领取大佬们推荐的学习资料flash-waimai 一个完整的外卖系统&#xff0c;包括手机端&#xff0c;后台管理&#xff0c;api基于spring boot和vue的前后端分离的外卖系统包含完整的手机端&#xff0c;后台管理功能本项目主要…

Android 外卖订餐APP开发

APP展示页面 &#xff1a; 本产品适用范围&#xff1a; 购买便利店系统任何版本&#xff0c;如需进行二次开发&#xff0c;需要单独联系我们队APP进行修改和调试&#xff0c;免收服务费用。本司接收任何定制功能&#xff0c;具体定制费用根据需求另付费。 2016全新生鲜外卖系统…

小程序外卖订单界面的 代码

html页面 . <view class"container"><view class"store-box"><view class"st-bg"></view><view class" flex justify-between store-info"><view class" flex flex-direction justify-start&…

网上订餐管理系统

网上订餐系统的主要功能是在线点餐&#xff0c;除此之外还有比如充值&#xff0c;菜谱管理&#xff0c;退餐&#xff0c;查看历史订单等等众多相关服务。在撰写论文的过程中&#xff0c;将结合理论实际&#xff0c;理清相关理论知识&#xff0c;同时与系统配合以解释实际应用和…

在线订餐管理系统

1、项目介绍 在线订餐管理系统拥有两种角色 管理员&#xff1a;菜品管理、类别管理、用户管理、订单管理、评价用户、留言管理等 用户&#xff1a;登录注册、点餐、购物车、历史订餐、留言 2、项目技术 后端框架&#xff1a; Servlet、mvc模式 前端技术&#xff1a;jsp、…

ChatGPT爆火?团餐行业如何实现智慧升级

最近&#xff0c;《流浪地球2》热映&#xff0c;影片科技感爆棚&#xff0c;画面感震撼&#xff0c;电影中的一些高科技智能设备也令人赞叹&#xff0c;空间站的云霄电梯可以直通空间站&#xff0c;酷炫的“外骨骼机器人能够辅助工程&#xff0c;智能电子狗“笨笨”能干又可爱&…

瑞吉外卖 - 后台系统退出功能(4)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

外卖订餐——吃货联盟订餐系统

通过一段时间的学习&#xff0c;也到了检验成果的时候了&#xff0c;下面通过实战提升对技能点的运用能力、积累项目经验。 “吃货联盟定餐系统”需求说明 现今已进入网络时代&#xff0c;网上购物、看新闻、交友等人们的日常生活已离不开网络。“只 要点点手指&#xff0c;就…

基于android 订餐外卖APP,前台后台服务都齐全

基于android开发的订餐外卖APP 一 项目介绍 该项目是基于android开发的订餐外卖app&#xff0c;前台和后台管理都有&#xff0c;内容很多&#xff0c;非常值得学习&#xff0c;二次开发&#xff0c;设计指导性项目。 二 软件技术说明 软件架构说明 项目技术&#xff1a; …

瑞吉外卖-后台系统功能

目录 前言后台系统登录功能需求分析代码实现实体类Mapper层Service层Controller层 总结 后台系统退出功能需求分析代码实现总结 后台登录优化需求分析代码实现方法一&#xff1a;过滤器方法二&#xff1a;拦截器 总结 前言 所有的命名要符合开发规范&#xff0c;本项目中不再解…

【瑞吉外卖】day09:用户地址簿功能、菜品展示、购物车、下单

目录 1. 用户地址簿功能 1.1 需求分析 1.2 数据模型 1.3 导入功能代码 1.4 功能测试 2. 菜品展示 2.1 需求分析 2.2 前端页面分析 2.3 代码开发 2.4 功能测试 3. 购物车 3.1 需求分析 3.2 数据模型 3.3 前端页面分析 3.4 准备工作 3.5 代码开发 3.6 功能测试 …

外卖管理系统(一)

内容 软件开发整体介绍 瑞吉外卖项目介绍 开发环境搭建 后台登录功能开发 后台退出功能开发 1. 软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程&#xff0c; 以及软件开发过程中涉及到的岗位角色&#xff0c;角色的分工、职责&#x…

外卖订餐管理系统

需求分析 项目概述 外卖订餐系统分成前台订餐管理子系统、店家信息管理子系统和后台管理子系统这三个子系统。用户通过此平台可以浏览菜品、查询菜品、查询店家&#xff0c;注册登录后可以提交订单、查询订单、管理个人信息等&#xff1b;商家通过此平台注册登录后可以接单、…

基于android的外卖在线订餐系统app

本外卖订餐系统是一个Android 客户端JSP Servlet服务端应用程序&#xff0c;启动Android上的应用程序后可以登录、查看菜品等,再者学校学生人数的增加&#xff0c;学生对餐饮服务的要求更加高&#xff1b;许多学生不满足于学校食堂的餐饮或嫌学校食堂就餐排队时间长&#xff0c…