用Java實現簡易的圖書管理系統(超詳細)

目錄

1.設計背景

2.設計思路

3.模塊展示及代碼演示

3.1 Book類的實現

3.2 BookList類的實現(書架)

3.3 異常類的實現(OperationException)

3.4 用戶類的實現

3.5 操作接口的實現(定義規范)

3.6 操作類的具體實現

3.6.1 增加操作

3.6.2 查找操作

3.6.3 刪除操作

3.6.4 顯示操作

3.6.5 借書操作

3.6.6 還書操作

3.6.7 退出功能

3.7 管理員類的實現

3.8 讀者類的實現

3.9 Test類

4. 整體效果展示


1.設計背景

圖書館作為每個大學或者城市必不可少的部分,其存放的海量書籍與文獻使得其管理顯得尤為困難,此時圖書管理系統就起到了一個重大的作用。本次就將使用java語言中的異常處理,多態,繼承,封裝,接口等知識點,來綜合性的設計與實現出一個簡易的圖書管理系統。

2.設計思路

①首先我們需要區分出管理員與普通用戶,不同的用戶所展示的界面不同,利用繼承和多態可以實現這一思路;

②我們可以將各個操作都封裝起來,單獨的設計成一個類,且這些操作都需要遵循一定的規范,而接口實際上就是定義了一種規范,這里可以使用接口來進行實現。

③我們需要將書的屬性進行封裝,同時設立一個書架類,即存放的是書的數組。

④我們需要實現管理員能夠添加書籍,查找書籍,刪除書籍以及顯示書籍;

⑤讀者能夠實現查找書籍,借閱書籍以及歸還書籍。

3.模塊展示及代碼演示

3.1 Book類的實現

我們這里書籍的屬性有書名、作者、價格、類型以及是否被借出,我們結合封裝性,將屬性設置為private權限,并提供相應的get方法和set方法,空參構造器,以及一個不包含是否被借出的構造器(布爾值的默認類型就是false,可以不進行初始化)并需要提供對應的toString()方法的重寫(具體重寫情況看展示效果),代碼實現如下:

public class Book {private String name;private String author;private int price;private String type;private boolean isBorrowed; //是否被借出//構造器public Book(){}public Book(String name,String author,int price,String type){this.author=author;this.name=name;this.price=price;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 int getPrice() {return price;}public void setPrice(int price) {this.price = price;}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;}
@Override
//重寫toString()public String toString() {return "Book{" +"書名:'" + name + '\'' +", 作者:'" + author + '\'' +", 價格:" + price +", 類型:'" + type + '\'' +", 是否借出:" + isBorrowed +'}';}
}

3.2 BookList類的實現(書架)

BookList類我們主要提供一個ArrayList的泛型數組來進行Book的存儲,便于后面對書籍的操作。

BookList類我們提供一個私有的ArrayList的泛型數組,同時在空參構造器中對其初始化,先加入幾本書籍,并提供對應的get和set方法,具體代碼實現如下:

import java.util.ArrayList;public class BookList {private ArrayList<Book> books=new ArrayList<Book>();public BookList() {books.add(new Book("三國演義","羅貫中",19,"小說"));books.add(new Book("西游記","吳承恩",29,"小說"));books.add(new Book("紅樓夢","曹雪芹",25,"小說"));}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.3 異常類的實現(OperationException)

異常的出現一般出現在操作中,我們可以通過自定義異常類的方式來處理不同異常情況的發生(也可以不進行定義),我們的自定義也提供一個空參構造器,和一個有參構造器用來打印異常信息(自定義異常類需要繼承Exception類),代碼實現如下:

public class OperationException extends Exception{static final long serialVersionUID=-33875169931L;//空參構造器public OperationException(){}public OperationException(String message){super(message); //Exception類中存在String參數的構造器和message}
}

3.4 用戶類的實現

用戶類中,我們需要定義用戶的名字,同時定義一個抽象方法menu()來給子類管理員類和讀者類重寫(二者的目錄不同),同時要提供set和get方法,并提供抽象Operation方法給子類重寫使用(子類的目錄不同,執行的操作就會存在差異),代碼實現如下:

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會拋出異常來處理異常,父類也需要拋出異常,
//因為父類拋出異常大小要大于子類重寫方法拋出的異常
}

3.5 操作接口的實現(定義規范)

我們需要執行的操作有增加,刪除,顯示,查找等,他們都需要遵循一定的規范,而這個規范就由接口來實現,在增刪查改等操作中,他們的主要方式就是工作,即work(),故接口中提供對應的work()方法供接口的實現類,即各種操作進行重寫,代碼實現如下:

public interface IOperation{void work(BookList bookList)throws Exception;
}

3.6 操作類的具體實現

3.6.1 增加操作

我們需要將操作類實現操作接口,同時為重寫的方法提供書架類,便于進行操作。代碼實現如下:

添加操作并沒有什么異常,在簡易圖書系統中不需要對書籍的信息進行檢驗。

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("請輸入圖書的價格:");int price=scan.nextInt();System.out.println("請輸入圖書的類型:");String type=scan.next();Book book=new Book(name,author,price,type); //新建書籍bookList.getBooks().add(book); //使用ArrayList的add來進行圖書的添加System.out.println("添加成功!");}
}

3.6.2 查找操作

查找操作只有兩種情況,一種是找到了,另一種自然就是沒找到,在沒找到的時候我們就可以選擇拋出一個異常,查找操作的具體實現還是通過遍歷來實現,代碼如下:

import java.util.Scanner;
//查找功能的實現
public class FindOperation implements IOperation{@Overridepublic void work(BookList bookList) throws OperationException {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("找到了!   信息如下:");System.out.println(bookList.getBooks().get(i));}}if(flag){throw new OperationException("沒有找到該書");}}
}

3.6.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("未查找到該書籍!");}}
}

3.6.4 顯示操作

顯示操作較為好實現,因為重寫過book的toString()方法了,所以可以直接遍歷BookList進行輸出即可,代碼如下:

public class DisplayOperation implements IOperation{//顯示功能的實現//結合book類的重寫進行@Overridepublic void work(BookList bookList) throws OperationException {for(int i=0;i<bookList.getBooks().size();i++){System.out.println(bookList.getBooks().get(i)); //直接輸出}}
}

3.6.5 借書操作

借書操作的實現也相同,先提供一個書名,然后遍歷書架,若有則判斷其是否已被借出,如果是,則拋出一個異常,否則就借出成功,并更改書的借出狀態;若沒有,即拋出一個未找到的異常。

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("未查找到該書");}}
}

3.6.6 還書操作

還書操作的過程,也是提供相應的書名,遍歷書架,若有該書,則進行歸還,同時設置其狀態為未被借出狀態;如果未找到該書,也拋出一個異常。

public class ReturnOperation implements IOperation{@Overridepublic 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("查無此書!");}}
}

3.6.7 退出功能

退出功能的實現較為簡單,我們這里使用System類中的靜態方法exit來進行實現,代碼如下:

//退出功能的實現
public class ExitOperation implements IOperation {@Overridepublic 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);}}
}

3.7 管理員類的實現

首先,管理員類需要繼承于用戶類,同時實現用戶類中的抽象方法menu(),同時實現抽象方法Operation(),這里可以利用接口的多態性來進行實現,同時我們要對Operation拋出的異常進行處理,同時拋出在選擇過程中會出現的異常,代碼如下:

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();}}
}

3.8 讀者類的實現

讀者類與管理員類同理,代碼如下:

public class Reader extends User{public Reader(String name){super(name);}@Overridepublic 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();}}
}

3.9 Test類

此時,我們所有的框架都已經搭建好了,只需要在Test類中添加main方法進行測試即可,代碼如下:

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);}
}

4. 整體效果展示

源碼地址在這:JavaSenior/day_02/src · 夕夕夕夕夕立/java - 碼云 - 開源中國 (gitee.com)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165385.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165385.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

標簽打印機打印標簽時出現,數據處理過程中錯誤 無法設置項目 圖片1的內容無法打印

環境&#xff1a; Win10專業版 NiceLabel Designer 10.1 問題描述&#xff1a; 標簽打印機打印標簽時出現&#xff0c;數據處理過程中錯誤 無法設置項目 圖片1的內容無法打印 解決方案&#xff1a; 1.刪除標簽部分文字打印測試 還是一樣&#xff08;未解決&#xff09; …

已解決java.lang.IllegalStateException異常的正確解決方法,親測有效!!!

已解決java.lang.IllegalStateException異常的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01;文章目錄 報錯問題解決思路解決方法交流 報錯問題 java.lang.IllegalStateException 解決思路 java.lang.IllegalStateException通常表示程序的當前狀態與…

jenkins 參數構建

應用保存 [rootjenkins-node1 .ssh]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved i…

【嵌入式面試】2022年嵌入式經典面試題匯總(C語言)

&#x1f4dc;作者&#xff1a;不想脫發的基兄 &#x1f4fa;專欄&#xff1a;《嵌入式面試》 &#x1f4e3;格言&#xff1a;不管前方的路有多苦&#xff0c;只要走的方向正確&#xff0c;不管多么崎嶇不平&#xff0c;都比站在原地更接近幸福。 前言&#xff1a; 2022年秋招我…

C++之初始化列表詳細剖析

一、初始化列表定義 初始化列表&#xff1a;以一個冒號開始&#xff0c;接著是一個以逗號分隔的數據成員列表&#xff0c;每個"成員變量"后面跟一個放在括號中的初始值或表達式。 class Date { public:Date(int year, int month, int day): _year(year), _month(mont…

OpenCV快速入門:圖像分析——圖像分割和圖像修復

文章目錄 前言一、圖像分割1.1 漫水填充法1.1.1 漫水填充法原理1.1.2 漫水填充法實現步驟1.1.3 代碼實現 1.2 分水嶺法1.2.1 分水嶺法原理1.2.2 分水嶺法實現步驟1.2.3 代碼實現 1.3 GrabCut法1.3.1 GrabCut法原理1.3.2 GrabCut法實現步驟1.3.3 代碼實現 1.4 Mean-Shift法1.4.1…

論文閱讀 (106):Decoupling maxlogit for out-of-distribution detection (2023 CVPR)

文章目錄 1 概述1.1 要點1.2 代碼1.3 引用 2 預備知識3 方法3.1 MaxLogit3.2 改進MaxCosine和MaxNorm3.3 DML 1 概述 1.1 要點 題目&#xff1a;解耦最大logit分布外檢測 (Decoupling maxlogit for out-of-distribution detection) 方法&#xff1a; 提出了一種心機基于log…

多級緩存快速上手

哈嘍~大家好&#xff0c;這篇來看看多級緩存。 &#x1f947;個人主頁&#xff1a;個人主頁????? &#x1f948; 系列專欄&#xff1a;【微服務】 &#x1f949;與這篇相關的文章&#xff1a; JAVA進程和線程JAVA進程和線程-CSDN博客Http…

不做機器視覺工程師,轉行,轉崗的建議與想法

正所謂外行看熱鬧&#xff0c;內行看門道。提前咨詢前輩們&#xff0c;多問問&#xff0c;多看看。要做就做&#xff0c;一定要提前做好防范。 無論你是要轉行或者是轉崗&#xff0c;看你有沒有本錢和試錯成本 有些人&#xff0c;家庭好&#xff0c;可以一直去試錯和從頭再來。…

無線WiFi安全滲透與攻防(國外篇):使用 Aircrack-ng 破解 WEP 密碼

使用 Aircrack-ng 破解 WEP 密碼 使用 Aircrack-ng 破解 WEP 密碼一. 用 Aircrack-ng 破解 WEP 密碼 - 背景知識網卡與網卡芯片WEP 加密協議WEP 所使用的身份認證協議二. 使用 Aircrack-ng 破解 WEP 密碼 - 破解原理破解機理三. 使用 Aircrack-ng 破解 WEP 密碼 - aircrack-ng …

學習.NET驗證模塊FluentValidation的基本用法(續1:其它常見用法)

FluentValidation模塊支持鏈式驗證方法調用&#xff0c;也就是說&#xff0c;除了 RuleFor(r > r.UserName).NotEmpty()調用方式之外&#xff0c;還可以將對單個屬性的多種驗證函數以鏈式調用方式串接起來&#xff0c;比如UserName屬性不能為空&#xff0c;長度在5~10之間&a…

__attribute__((constructor))用法解析

__attribute__((constructor))是GCC和兼容的編譯器中的一個特性&#xff0c;用于指示編譯器將一個函數標記為在程序啟動時自動執行的初始化函數。 同樣的還有__attribute__((destructor))在main()函數后調用。 當你在一個函數聲明或定義前加上__attribute__((constructor))屬…

淺談 Guava 中的 ImmutableMap.of 方法的坑

作者&#xff1a;明明如月學長&#xff0c; CSDN 博客專家&#xff0c;大廠高級 Java 工程師&#xff0c;《性能優化方法論》作者、《解鎖大廠思維&#xff1a;剖析《阿里巴巴Java開發手冊》》、《再學經典&#xff1a;《EffectiveJava》獨家解析》專欄作者。 熱門文章推薦&…

vue項目下.env.development環境變量配置文件

.env.development 文件是一個用于開發環境配置的文件。在許多應用程序中&#xff0c;開發環境和生產環境具有不同的配置需求。.env.development 文件允許你在開發環境中定義特定的環境變量和配置選項。 一般來說&#xff0c;.env.development 文件用于存儲開發環境相關的配置信…

國自然項目基金撰寫的隱藏技巧、范例分析及提交前的自我審查

目錄 一、基金項目申請要求、重點及項目介紹 二、基金的撰寫技巧 三、基金撰寫的隱藏技巧 四、范例分析及提交前的自我審查 更多應用 基金項目申請需要進行跨學科的技術融合&#xff0c;申請人需要與不同領域結合&#xff0c;形成多學科交叉的研究。基金項目申請在新時期更…

由紅黑樹引出的HashMap擴容機制的思考

紅黑樹是什么&#xff1f; 三大特點&#xff1a; 根節點是黑色&#xff0c;葉節點是不存儲數據的黑色空節點 任何相鄰的兩個節點不能同時為紅色 任意節點到其可到達的節點間包含相同數量的黑色節點 聯想&#xff1a;Java HashMap底層紅黑樹原理 HashMap基于哈希表Map接口實…

快速掌握Pyqt5的三種主窗口

PyQt5是一個強大的跨平臺GUI框架&#xff0c;它提供了多種不同類型的主窗口類&#xff0c;以滿足不同的應用需求。下面是PyQt5中最常見的幾種主窗口類型及其創建方式的簡介&#xff1a; 1. QMainWindow QMainWindow是用于創建具有菜單欄、工具欄、狀態欄和中心窗口部件&#…

內存池 示例一

內存池是一種管理內存分配和釋放的技術&#xff0c;用于優化內存的使用效率。它通過預先分配一塊內存區域&#xff0c;并將其劃分為多個較小的塊&#xff08;內存塊池&#xff09;&#xff0c;然后按需分配這些內存塊來減少內存碎片化和頻繁的系統調用。這些內存塊可以是相同大…

Centos7.9配置nfs共享及rsync同步

客戶需求對oracle數據庫做一個跨機房的備份&#xff0c;原環境已做rman備份和每天expdp全庫導出&#xff0c;遠端只有虛擬化環境&#xff0c;可提供一個虛擬機&#xff0c;2個機房間網絡互通。 首先配置nfs服務端 查看操作系統版本 [rootnas199 ~]# more /etc/redhat-relea…

Python面經【1】

一、協程的相關概念 協程&#xff08;又稱微線程&#xff09;運行在線程之上&#xff0c;更加輕量級&#xff0c;協程并沒有增加線程總數&#xff0c;只是在線程的基礎上通過分時復用的方式運行多個協程&#xff0c;大大提高工程效率。 協程的特點&#xff1a; 輕量級&#…