开启Java之旅——用Java实现简易的图书管理系统(24.4.7)

图书管理系统

一、设计思路

1、首先需要区分两类人,图书管理员和借书用户,不同的用户要展现不同的界面,利用继承和多态可以将其实现。

2、要将不同的操作封装起来,单独设计成为一个类,为了规范实现,需要使用接口。

3、要将书的属性进行封装,设立一个书架,及存放书的数组。

4、实现管理员添加书籍,查找书籍,删除书籍以及显示书籍。

5、读者可以查找书籍,借阅书籍以及归还书籍。

二、代码

1、book类的实现

书籍的属性有书名、作者、类型以及是否被借出,结合封装、private权限,并提供相应的get 方法和set 方法,空参构造器以及一个不包含是否被借出的构造器(布尔值的默认类型就是false,可以不进行初始化)并需要提供对应的toString()方法的重写

代码实现如下:

package com.sh.Library;public class Book {private String name;private String author;private String type;private boolean isBorrowed; //是否被借出//构造器public Book(){}public Book(String name,String author,String type){this.author=author;this.name=name;this.type=type;}//get、set方法public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getType() {return type;}public void setType(String type) {this.type = type;}public boolean isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}//重写toString()public String toString() {return "Book{" + "书名:'" + name + '\'' + ", 作者:'" + author + '\'' + ", 类型:'" + type + '\'' + ", 是否借出:" + isBorrowed + '}';}}

2、BookList类的实现

BookList类提供一个ArrayList的泛型数组来进行Book的存储,便于后面对书籍的操作。

BookList类我们提供一个私有的ArrayList的泛型数组,同时在空参构造器中对其初始化,先加入几本书籍,并提供对应的get和set方法

代码实现如下:

package com.sh.Library;import java.util.ArrayList;public class BookList {private ArrayList<Book> books = new ArrayList<Book>();public BookList() {books.add(new Book("倾城之恋","张爱玲","小说"));books.add(new Book("背影","朱自清","散文"));books.add(new Book("你好,旧时光","八月长安","小说"));}public Book getBook(int pos){ //获取某个位置上的书籍return books.get(pos);}public void setBook(int pos,Book book){ //设置某个位置上的书籍books.set(pos,book);}public ArrayList<Book> getBooks(){  //获取书架,便于后面的Operation的使用return books;}}

3、OperationException

异常的出现一般出现在操作中,我们可以通过自定义异常类的方式来处理不同异常情况的发生(也可以不进行定义),我们的自定义也提供一个空参构造器,和一个有参构造器用来打印异常信息(自定义异常类需要继承Exception类)

代码实现如下:

package com.sh.Library;public class OperationException extends Exception{static final long serialVersionUID=-33875169931L;//空参构造器public OperationException(){}public OperationException(String message){super(message); //Exception类中存在String参数的构造器和message}
}

4、用户类的实现

用户类中,我们需要定义用户的名字,同时定义一个抽象方法menu()来给子类管理员类和读者类重写(二者的目录不同),同时要提供set和get方法,并提供抽象Operation方法给子类重写使用(子类的目录不同,执行的操作就会存在差异)

代码实现如下:

package com.sh.Library;public abstract class User {private String name;public User(String name){this.name=name;}public User(){}public abstract void menu();public String getName(){return name;}public void setName(String name){this.name=name;}public abstract void Operation(int n, BookList bookList)throws OperationException;//子类的Operation会抛出异常来处理异常,父类也需要抛出异常,//因为父类抛出异常大小要大于子类重写方法抛出的异常
}

5、操作接口的实现

我们需要执行的操作有增加,删除,显示,查找等,他们都需要遵循一定的规范,而这个规范就由接口来实现,在增删查改等操作中,他们的主要方式就是工作,即work(),故接口中提供对应的work()方法供接口的实现类,即各种操作进行重写

代码实现如下:

package com.sh.Library;public interface IOperation{void work(BookList bookList)throws Exception;
}

6、操作类实现

(1)增加

我们需要将操作类实现操作接口,同时为重写的方法提供书架类,便于进行操作。代码实现如下:

添加操作并没有什么异常,在简易图书系统中不需要对书籍的信息进行检验。

package com.sh.Library;import java.util.Scanner;public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("新增图书!");Scanner scan=new Scanner(System.in);System.out.println("请输入要新增图书的名字:");String name=scan.next();System.out.println("请输入作者的名字:");String author=scan.next();System.out.println("请输入图书的类型:");String type=scan.next();Book book=new Book(name,author,type); //新建书籍bookList.getBooks().add(book); //使用ArrayList的add来进行图书的添加System.out.println("添加成功!");}}
(2)添加

查找操作只有两种情况,一种是找到了,另一种自然就是没找到,在没找到的时候我们就可以选择抛出一个异常,查找操作的具体实现还是通过遍历来实现

代码如下:

package com.sh.Library;import java.util.Scanner;public class AddOperation implements IOperation{public void work(BookList bookList) {System.out.println("新增图书!");Scanner scan=new Scanner(System.in);System.out.println("请输入要新增图书的名字:");String name=scan.next();System.out.println("请输入作者的名字:");String author=scan.next();System.out.println("请输入图书的类型:");String type=scan.next();Book book=new Book(name,author,type); //新建书籍bookList.getBooks().add(book); //使用ArrayList的add来进行图书的添加System.out.println("添加成功!");}}
(3)删除

删除操作同理,也是提供相应的书名,然后进行搜索,如果找到了,就使用remove()方法进行删除,否则就抛出一个异常,具体还是通过遍历实现:

public class DelOperation implements IOperation{public void work(BookList bookList)throws OperationException{System.out.println("请输入你想要删除的书籍:");Scanner scan=new Scanner(System.in);String name=scan.next();boolean flag=true;for(int i=0;i< bookList.getBooks().size();i++){if(bookList.getBooks().get(i).getName().equals(name)){flag=false;System.out.println("查找到了,请问是否要进行删除:"+name+"(Y/N)");if(scan.next().equalsIgnoreCase("y")){ //进行删除操作bookList.getBooks().remove(i);System.out.println("删除成功!");}}}if(flag){throw new OperationException("未查找到该书籍!");}}
}
(4)显示

显示操作较为好实现,因为重写过book的toString()方法了,所以可以直接遍历BookList进行输出即可

代码如下:

package com.sh.Library;public class DisplayOperation implements IOperation{//显示功能的实现//结合book类的重写进行public void work(BookList bookList) throws OperationException {for(int i=0;i<bookList.getBooks().size();i++){System.out.println(bookList.getBooks().get(i)); //直接输出}}
}
(5)借书

借书操作的实现也相同,先提供一个书名,然后遍历书架,若有则判断其是否已被借出,如果是,则抛出一个异常,否则就借出成功,并更改书的借出状态;若没有,即抛出一个未找到的异常。

package com.sh.Library;public class BorrowOperation implements IOperation{public void work(BookList bookList)throws OperationException{System.out.println("请输入你想要借的书:");Scanner scan=new Scanner(System.in);String name=scan.next();boolean flag=true;for(int i=0;i< bookList.getBooks().size();i++){if(bookList.getBooks().get(i).getName().equals(name)){ //查找到该书籍在图书馆中flag=false;if(bookList.getBooks().get(i).isBorrowed()==true){throw new OperationException("借书失败,该书已被借出");}else{ //书未被借出System.out.println("借出成功!");bookList.getBooks().get(i).setBorrowed(true);}}}//出循环了,仍未找到if(flag) {throw new OperationException("未查找到该书");}}
}
(6)还书

还书操作的过程,也是提供相应的书名,遍历书架,若有该书,则进行归还,同时设置其状态为未被借出状态;如果未找到该书,也抛出一个异常。

package com.sh.Library;public class ReturnOperation implements IOperation{public void work(BookList bookList) throws Exception {Scanner scan=new Scanner(System.in);System.out.println("请输入你要归还的书籍:");String name=scan.next();boolean flag=true;for(int i=0;i<bookList.getBooks().size();i++){if(bookList.getBooks().get(i).getName().equals(name)){flag=false;System.out.println("成功归还!");bookList.getBooks().get(i).setBorrowed(false);}}if(flag){throw new OperationException("查无此书!");}}
}
(7)退书

退出功能的实现较为简单,我们这里使用System类中的静态方法exit来进行实现

代码如下:

package com.sh.Library;
//退出功能的实现public class ExitOperation implements IOperation {public void work(BookList bookList) throws OperationException {System.out.println("是否要进行退出?"+"(Y/N)");Scanner scan=new Scanner(System.in);if(scan.next().equalsIgnoreCase("Y")){System.out.println("退出成功!");System.exit(0);}}}

7、管理员的实现

首先,管理员类需要继承于用户类,同时实现用户类中的抽象方法menu(),同时实现抽象方法Operation(),这里可以利用接口的多态性来进行实现,同时我们要对Operation抛出的异常进行处理,同时抛出在选择过程中会出现的异常

代码如下:

package com.sh.Library;
public class Admin extends User{public Admin(String name){super(name);}public void menu(){System.out.println("尊敬的管理员:"+this.getName()+"欢迎来到图书管理系统");System.out.println("1.查找图书");System.out.println("2.新增图书");System.out.println("3.删除图书");System.out.println("4.显示图书");System.out.println("0.退出系统");}public  void Operation(int n,BookList bookList)throws OperationException{IOperation iOperation=null;switch(n){case 0:iOperation= new ExitOperation();break;case 1:iOperation=new FindOperation();break;case 2:iOperation=new AddOperation();break;case 3:iOperation=new DelOperation();break;case 4:iOperation= new DisplayOperation();break;default:throw new OperationException("输入错误,请重新输入!");}try {iOperation.work(bookList);}catch(OperationException e){System.out.println(e.getMessage());} catch (Exception e) {e.printStackTrace();}}
}

8、读者类的实现

package com.sh.Library;public class Reader extends User{public Reader(String name){super(name);}public void menu() {System.out.println("尊敬的读者:"+this.getName()+"欢迎来到图书馆");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");}public void Operation(int n, BookList bookList)throws OperationException {IOperation iOperation=null;switch(n){case 0:iOperation= new ExitOperation();break;case 1:iOperation=new FindOperation();break;case 2:iOperation=new BorrowOperation();break;case 3:iOperation=new ReturnOperation();break;default:throw new OperationException("输入错误,请重新输入!");}try {iOperation.work(bookList);}catch(OperationException e){System.out.println(e.getMessage());} catch (Exception e) {e.printStackTrace();}}
}

9、Test类

package com.sh.Library;
public class Test {public static void main(String[] args){System.out.println("请输入你的身份:");System.out.println("管理员/普通用户(0/1)");Scanner scan=new Scanner(System.in);int choice=scan.nextInt();System.out.println("请输入你的姓名:");User user=null;BookList bookList=new BookList();switch(choice){ //进行身份的选择case 0:user=new Admin(scan.next());break;case 1:user=new Reader(scan.next());}IOperation iOperation=null;do {user.menu();System.out.println("请输入你要进行的操作:");int input=scan.nextInt();if(input==0){System.out.println("退出成功");return;}try {user.Operation(input, bookList);}catch(OperationException e){System.out.println(e.getMessage());}}while(true);}
}

10、展示(嘿嘿)

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

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

相关文章

解决前端精度丢失问题:后端Long类型到前端的处理策略

在Web开发中&#xff0c;我们经常遇到前后端数据类型不匹配的问题&#xff0c;特别是当后端使用大数据类型如Long时&#xff0c;前端由于JavaScript的数字精度限制&#xff0c;可能导致精度丢失。本文将深入探讨这个问题&#xff0c;并提供两种有效的解决方法。 一、问题背景 …

汇编基础----mov基本操作

汇编基础----mov基本操作 下载VS2022 这个网上教程很多,自行下载安装即可 新建项目 选择空项目,如何点击下一步 在源文件下创建这二个文件 修改配置使asm文件能被解析,右击项目名(demo)->生成依赖项->生成自定义->勾选如下图所示选项->确定 立即数寻址 main…

Linux--APP打开的文件在内核中如何表示

当用户在程序中使用了glibc库提供的文件操作函数open&#xff08;&#xff09;、read&#xff08;&#xff09;等访问文件时&#xff0c;这些函数会调用相应的系统调用来实际执行文件操作&#xff0c;并返回一个整数即文件句柄&#xff0c;文件句柄实际上是对应的 struct file …

PHP 中的 $2y$10,PHP 字符串加密函数 password_hash

PHP 用户密码加密函数 password_hash 自PHP5.5.0之后&#xff0c;新增加了密码散列算法函数(password_hash)&#xff0c;password_hash() 使用足够强度的单向散列算法创建密码的散列 Hash。 password_hash() 兼容 crypt()。 所以&#xff0c; crypt() 创建的密码散列也可用于 …

畅捷通TPlus 存在KeyInfoList.aspx SQL注入漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 畅捷通T专属云适用于需要一体化管理的企业&#xf…

Python+Vuecil笔记

Nginx 进入目录: C:\nginx-1.20.2\nginx-1.20.2 start nginx 开始 nginx -s stop 停止 nginx -s quit 退出CSS 通过标签去写css 循环展示数据 JS 点击时执行事件 Django 配置media 在seetings里面修改 STATIC_URL /static/ MEDIA_URL /upload/ MEDIA_ROOT os.pat…

基于微信小程序的亿家旺生鲜云订单零售系统的设计与实现(论文+源码)_kaic

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了亿家旺生鲜云订单零售系统的开发全过程。通过分析亿家旺生鲜云订单零售系统管理的不足&#xff0c;创建了一个计算机管理亿家旺生鲜云订单零售系统的方案。文章介…

【JavaWeb】Day37.MySQL概述——数据库设计-DML

数据库操作-DML DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 1.增加(insert) insert语法&#xff1a; 向指定字段添加数据 insert into 表名 (字段名1, 字段名2) values (值1, 值2); 全部字段添加数据…

Hive3.0.0建库表命令测试

Hive创建表格格式如下&#xff1a; create [external] table [if not exists] table_name [(col_name data_type [comment col_comment],)] [comment table_comment] [partitioned by(col_name data_type [comment col_comment],)] [clustered by (col_name,col_name,...)…

Spring Security——08,自定义失败处理

自定义失败处理 一、自定义实现类1.1 实现AccessDeniedHandler1.2 实现AuthenticationEntryPoint 二、配置SpringSecurity三、测试3.1 认证失败3.2 权限不足 一键三连有没有捏~~ 我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json&#xff0c…

K8S - Service简介和 1个简单NodePort例子

大纲图 流量方向 如上图&#xff0c; 当用户or 别的service 从k8s 集群外部访问 集群内的services 流量方向有两种 一种是垂直方向&#xff0c; 通过域名 -> Load Balancer -> gateway -> services , 在k8s 一般是通过ingress 来实现&#xff0c; 而ingress 不是本文…

工程中实践的微服务设计模式

大家好&#xff0c;我是 方圆。最近在读《微服务架构设计模式》&#xff0c;开始的时候我非常的好奇&#xff0c;因为在我印象中&#xff0c;设计模式是常说的那23种设计模式&#xff0c;而微服务的设计模式又是什么呢&#xff1f;这个问题也留给大家&#xff0c;在文末我会附上…