圖書管理系統(附源碼)

前言:前面一起和小伙伴們學習了較為完整的Java語法體系,那么本篇將運用這些知識連串在一起實現圖書管理系統


目錄

一、總體設計

二、書籍與書架

書籍(Book)

書架(Booklist)

三、對圖書的相關操作

IOperations接口

ShowOperation

FindOperation

BorrowOperation

ReturnOperation

AddOperation

DeleteOperation

ExitOperation?

三、用戶

用戶抽象類(User)

NormalUser

AdminUser

Main( 測試 )

注冊方法:

main方法:


以面向對象的思想來實現?圖書管理系統。

一、總體設計

系統設計框架圖

系統設計思想:

用不同的包來分裝不同的類別。共創建book包、user包和operation包。

1、book包

與書相關的有書本與書架,封裝共同放入book包,體現了封裝的設計思想。

?2、user包

user包中用戶分為普通用戶類與管理員類,共同繼承User抽象類,不同的子類有不同的行為現象,這里體現了多態的設計思想

?3、operation包

定義IOperation接口并創建接口數組,再定義不同的圖書業務如刪除圖書類、借閱圖書類、歸還圖書類等等去實現IOperation接口并重寫業務方法。并用接口數組間接實例化圖書業務對象,通過數組下標來調用不同的圖書業務類。

結構圖:


二、書籍與書架

書籍(Book)

提供書籍相關信息:

  • 書名
  • 作者
  • 價格
  • 類型
  • 借出情況

對于成員變量及成員方法,不可盲目地設計其權限性為public,對于這種情況,最好使用private進行封裝。

代碼如下:(代碼中也有適當注釋)

package book;public class Book {private String name;private String author;private int price;private String type;private boolean isBorrowed;//構造方法初始化public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;//借出情況類型為布爾類型,默認值為未借出,省略不寫。}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;}//以字符串形式打印書籍相關信息@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((isBorrowed==true)? " 已借出":" 未借出")+// ", isBorrowed=" + isBorrowed +//注意這里,借出情況信息不應該設置為ture or false//可以進行如68行修改'}';}
}

書架(Booklist)

書架用來存放書籍,書架可以被視為書籍數組,每一個元素都是一本書籍,提供:

  • 初始化書籍信息并封裝
  • 記錄存放數量并封裝

代碼如下:

package book;public class BookList {private Book [] books =new Book[10];private int count;//實際放的書本數public BookList() {this.books[0]=new Book("三國演義","羅貫中",20,"小說");this.books[1]=new Book("西游記","吳承恩",30,"小說");this.books[2]=new Book("紅樓夢","曹雪芹",30,"笑說");this.count=3;}//拿書public Book getBooks(int pos) {return books[pos];}//設置書的位置public void setBooks(int pos,Book books) {this.books[pos] = books;}//作用找書public Book[] getBooks(){return books;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}}

三、對圖書的相關操作

IOperations接口

ioperation接口的作用:

  • 被圖書業務操作類實現
  • 創建IOperation接口數組,并用接口數組間接實例化圖書業務對象,通過數組下標來調用不同的圖書業務類。(User類中定義)

提供信息:

  • 定義含參 ( 書架 )的work方法
package ioperation;import book.BookList;public interface IOperations {void work(BookList bookList);
}

ShowOperation

ShowOperation內容及作用:

  • 重寫接口方法
  • 打印書籍信息
package ioperation;import book.Book;
import book.BookList;public class ShowOperation implements IOperations {@Overridepublic void work(BookList bookList) {//記錄書本數量int count= bookList.getCount();//遍歷數組for (int i = 0; i < count; i++) {Book book =bookList.getBooks(i);// 這里不能直接打印booklist[i],因為 booklist是引用System.out.println(book);}}
}

FindOperation

FindOperation作用:

  • 在遍歷書籍數組時利用equal方法核對書籍信息
package ioperation;
import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("查照圖書----------");Scanner scanner=new Scanner(System.in);System.out.println("請輸入你要查找的圖書書名:");String name=scanner.nextLine();int count=bookList.getCount();for (int i = 0; i < count; i++) {Book book =bookList.getBooks(i);if (book.getName().equals(name)){System.out.println("找到該圖書"+book);return;}}//若找到了圖書在22行return返回則運行不到這里System.out.println("沒有找到這本書");}
}

BorrowOperation

BorrowOperation作用

  • 找到需要借閱的書籍更改借閱狀態
package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class BorrowOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("借閱圖書---------");Scanner scanner = new Scanner(System.in);System.out.println("請輸入你要借閱的圖書書名--");String name = scanner.nextLine();int count = bookList.getCount();for (int i = 0; i < count; i++) {Book book = bookList.getBooks(i);if (book.getName().equals(name)) {if (book.isBorrowed()) {System.out.println("這本書已被借出!");return;}//設置借閱情況book.setBorrowed(true);System.out.println("借閱成功!");return;}}System.out.println("沒有你要借的這本書");}
}

ReturnOperation

ReturnOperation內容及作用:

  • 找到需要歸還的書籍更改借閱狀態
package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class ReturnOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("歸還圖書--------");Scanner scanner=new Scanner(System.in);System.out.println("請輸入你要歸還的書:");String name= scanner.nextLine();int count= bookList.getCount();for (int i = 0; i < count; i++) {Book book = bookList.getBooks(i);if(book.getName().equals(name)){//檢測前提當前是否被借出if(book.isBorrowed()){System.out.println("歸還成功!");//設置為未借出book.setBorrowed(false);return;}System.out.println("沒有你歸還的書,歸還失敗!");}}}
}

AddOperation

AddOperation作用:

  • 新增書籍
package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class AddOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("新增圖書-------");//判滿int count=bookList.getCount();if(count==bookList.getBooks().length){System.out.println("書架已滿!");}//輸入圖書信息Scanner scanner=new Scanner(System.in);System.out.println("請輸入你要新增的圖書書名:");String name=scanner.nextLine();System.out.println("請輸入作者名稱:");String author =scanner.nextLine();System.out.println("請輸入書本類型:");String type= scanner.nextLine();System.out.println("請輸入價格:");int price=scanner.nextInt();Book newbook=new Book(name,author,price,type);for (int i = 0; i < count; i++) {Book book = bookList.getBooks(i);if (book.getName().equals(name)) {System.out.println("已存在該圖書!");return;}}//放入新書bookList.setBooks(count,newbook);//書本數量加1bookList.setCount(count+1);System.out.println("新增圖書成功!");}}

DeleteOperation

DeleteOperation相對復雜一點

刪除步驟:

  • 遍歷書籍數組記錄要刪除書本的下標
  • 后一個下標的書籍信息依次覆蓋當前下標書籍信息,達到刪除目的

代碼如下:

package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class DeleOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("刪除圖書------");Scanner scanner=new Scanner(System.in);System.out.println("請輸入你要刪除的圖書書名:");String name=scanner.nextLine();int count=bookList.getCount();int pos = 0;int i = 0;//找到書for (; i < count; i++) {Book book = bookList.getBooks(i);if (book.getName().equals(name)) {pos = i;break;}}if(i==count){System.out.println("沒有你要刪除的書!");return;}for (int j = pos; j < count-1; j++) {//拿下標為j+1書Book book = bookList.getBooks(j+1);//放入j位置bookList.setBooks(j,book);}//書本數量減1bookList.setBooks(count-1,null);bookList.setCount(count-1);System.out.println("刪除成功!");}}

ExitOperation?

ExitOperation 內容:

  • System.exit(0) 退出系統
package ioperation;
import book.BookList;public class ExitOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("退出系統--------");System.exit(0);}
}

三、用戶

用戶分為普通用戶類與管理員類。

User

創建User抽象類來抽取普通用戶類與管理員類的共性,不同的子類有不同的行為現象,這里體現了多態的設計思想。因為User類為抽象類,其訪問限定符應設置為protected。

User內容(共性的抽取)

  • 定義用戶名
  • 定義接口數組
  • 定義doIoperation方法

doIoperation方法說明:

  • 傳參數圖書業務號碼及書架
  • 通過對數組下標來訪問對應業務
package use;
import book.BookList;
import ioperation.IOperations;public abstract class User {protected String name;//定義接口數組public IOperations[] ioperations;public User(String name) {this.name = name;}//抽取共性菜單protected abstract int menu();public void doIoperation(int choice, BookList bookList){ioperations[choice].work(bookList);}
}

NormalUser

NormalUser繼承User類

  • 在構造方法中初始化操作數組,并間接實例化操作業務等類的對象
  • 打印菜單并返回用戶業務數字
package use;
import ioperation.*;
import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);this.ioperations=new IOperations[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};}@Overrideprotected int menu() {System.out.println("-----------------------");System.out.println("1、查找圖書");System.out.println("2、借閱圖書");System.out.println("3、歸還圖書");System.out.println("0、退出系統");System.out.println("-----------------------");System.out.println("請輸入你的選擇----------");Scanner scanner=new Scanner(System.in);return scanner.nextInt();}
}

AdminUser

AdminUserr繼承User類

  • 在構造方法中初始化操作數組,并間接實例化操作業務等類的對象
  • 打印菜單并返回用戶選擇的圖書業務數字
package use;
import ioperation.*;
import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name) {super(name);this.ioperations=new IOperations[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DeleOperation(),new ShowOperation()};}@Overrideprotected int menu() {System.out.println("-----------------------");System.out.println("1、查找圖書");System.out.println("2、新增圖書");System.out.println("3、刪除圖書");System.out.println("4、顯示圖書");System.out.println("0、退出系統");System.out.println("-----------------------");System.out.println("請輸入你的選擇: ");Scanner scanner=new Scanner(System.in);return scanner.nextInt();}}

Main( 測試 )

Main為測試類包含

注冊方法:

  • 根據選擇不同實例化不同用戶對象并返回(在實例化的同時已經調用了該用戶類的構造方法,也就是已經初始化好了用戶的圖書業務權限)
  • 返回類型為User,這里采用了向上轉型

main方法:

  • 實例化書架
  • 調用Login方法獲得用戶身份(這里轉型有疑惑的建議看多態性第五條轉型問題)
  • 進入循環可以實現一次運行多次選擇業務
  • 用choice接受用戶需要辦理的圖書業務對應數字
  • 調用user的doIoperation方法完成圖書操作
package use;
import book.BookList;
import java.util.Scanner;public class Main {public static User Login() {System.out.println("請輸入你的名字");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();System.out.println("請輸入你的身份: 1、管理員  2、用戶");int choice = scanner.nextInt();if (choice == 1) {return new AdminUser(name);} else if (choice == 2) {return new NormalUser(name);}return null;}public static void main(String[] args) {BookList booklist = new BookList();User user = Login();while (true) {int choice = user.menu();user.doIoperation(choice, booklist);}}
}

寫作不易,求路過的朋友們給個三連與關注。有寫的不對的地方,歡迎大佬們在評論區指出錯誤并指導。

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

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

相關文章

已解決問題 | 該擴展程序未列在 Chrome 網上應用店中,并可能是在您不知情的情況下添加的

在Chrome瀏覽器中&#xff0c;如果你看到“該擴展程序未列在 Chrome 網上應用店中&#xff0c;并可能是在您不知情的情況下添加的”這樣的提示&#xff0c;通常是因為該擴展程序沒有通過Chrome網上應用店進行安裝。以下是解決這個問題的步驟&#xff1a; 解決辦法&#xff1a;…

Spring Boot整合Redis緩存的最佳實踐

Spring Boot整合Redis緩存的最佳實踐 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在現代應用開發中&#xff0c;緩存是提升系統性能和響應速度的關鍵技術之…

kali/ubuntu安裝vulhub

無須更換源&#xff0c;安裝docker-compose apt install docker.io docker -vdocker-compose #提示沒有&#xff0c;輸入y安裝mkdir -p /etc/docker vi /etc/docker/daemon.json #更換dockerhub國內源┌──(root?kali)-[/home/kali/vulhub-master/tomcat/CVE-2017-12615] …

【VScode】常規插件安裝

以下是VScode常規插件安裝&#xff1a; C/C C/C extension pack C/C themes Draw.io integration highlight 以上插件安裝完畢后&#xff0c;可實現 字體高亮&#xff0c;自動補齊&#xff0c;函數跳轉&#xff0c;主題切換&#xff0c;圖表生成等常用功能。

中介子方程三十七

XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXdXXuXXW…

【TensorFlow深度學習】對比學習的核心:實例與上下文的對抗

對比學習的核心&#xff1a;實例與上下文的對抗 對比學習概述實例與上下文的對抗&#xff1a;核心機制實戰代碼示例&#xff1a;使用PyTorch實現SimCLR結語 在深度學習的浩瀚星海中&#xff0c;對比學習作為自我監督學習的一個分支&#xff0c;正以破竹之勢引領著無標注數據利用…

dledger原理源碼分析系列(三)-選主

簡介 dledger是openmessaging的一個組件&#xff0c; raft算法實現&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何實現raft概念&#xff0c;以及dledger在rocketmq的應用 本系列使用dledger v0.40 本文分析dledger的選主 關鍵詞 Raft Openmessaging 心跳/選…

SpringMVC中的異常處理器

文章目錄 12異常處理器12.1基于配置的異常處理HandlerExceptionResolver接口直接在springmvc中聲明使用 12.2基于注解的異常處理需要書寫異常的配置類 12異常處理器 12.1基于配置的異常處理 HandlerExceptionResolver接口 接口實現類&#xff1a; DefaultHandlerExceptionR…

Linux安裝redis教程(超級詳細,新手必看)

環境&#xff1a; Centos 7.9 一、安裝準備工作 1.配置gcc 安裝redis前需要配置gcc&#xff1a; yum install gcc如果配置gcc出現依賴包問題&#xff0c;可以到主頁查看帖子解決&#xff1a;https://blog.csdn.net/m0_59117906/article/details/134451622?spm1001.2014.300…

這四款軟件很好用,可以提升工作、學習效率

TableConvert TableConvert是一個基于Web的在線表格轉換工具&#xff0c;能夠將多種格式的表格數據進行快速轉換。它支持將Excel、URL、HTML、JSON、CSV等格式轉換為Markdown表、CSV/TSV、XML、YAML、插入SQL、HTML、Excel和LaTeX等格式。用戶只需將表格數據粘貼到編輯器&#…

設置HTML元素的背景顏色

設置HTML元素的背景顏色 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;在本文中&#xff0c;我們將探討如何使用HTML和CSS來設置HTML元素的背景顏色。背景顏色…

本教程將指導如何通過 Vue 組件和后端 API 交互

本人詳解 作者:王文峰,參加過 CSDN 2020年度博客之星,《Java王大師王天師》 公眾號:JAVA開發王大師,專注于天道酬勤的 Java 開發問題中國國學、傳統文化和代碼愛好者的程序人生,期待你的關注和支持!本人外號:神秘小峯 山峯 轉載說明:務必注明來源(注明:作者:王文峰…

常用TELNET命令及其應用

常用TELNET命令及其應用 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; TELNET是一種基于文本協議的網絡協議&#xff0c;主要用于遠程登錄到網絡設備和服務器…

計算機視覺全系列實戰教程 (十五):使用opencv對視頻進行基本處理

視頻處理基本介紹 1、基本概述(1)opencv中視頻處理的兩個基礎類(2)視頻的屬性&#xff1a;獲取屬性和設置屬性 2、VideoCapture的介紹(1)Why( VideoCapture類的作用)(2)How( 如何使用VideoCapture)A.播放視頻文件函數B.播放視頻文件并實現暫停和繼續 3、VideoWriter類的介紹(1)…

CJSON庫

目錄 一、介紹 1、JSON是什么 2、為什么使用CJSON 3、JSON格式 二、使用CJSON構造JSON 1、創建對象 2、添加字段 3、轉換格式 4、釋放對象 三、使用CJSON解析JSON 1、解析數據 2、 獲取字段 3、釋放對象 一、介紹 1、JSON是什么 JSON是什么呢&#xff1f;JSON全稱…

折半查找詳解

一&#xff1a;折半查找概念 折半查找&#xff08;也稱為二分查找&#xff09;是一種在有序數組中查找某一特定元素的搜索算法。搜索過程從數組的中間元素開始&#xff0c;如果中間元素正好是目標值&#xff0c;則搜索過程結束&#xff1b;如果目標值大于或小于中間元素&#x…

OceanBase 4.2.1 離線安裝

OceanBase 4.2.1 離線安裝 4.2 版本的OceanBase支持一鍵安裝&#xff0c;所以在線版本的安裝簡單了很多&#xff0c;但在無法連接網絡的情況下安裝就只能手動離線安裝。 注&#xff1a;如下安裝過程都是在同一臺機器上面進行&#xff0c;也就是只有一個節點&#xff0c;多個節…

SSM網上旅游信息管理系統-計算機畢業設計源碼06975

目 錄 摘要 1 緒論 1.1 研究背景 1.2 研究意義 1.3論文結構與章節安排 2 系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 數據新增流程 2.2.2 數據刪除流程 2.3 系統功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系統用例分析 2.5本章小結 3 系統總體設…

Oracle、MySQL、PostGreSQL、SQL Server-查詢每秒事務數

Oracle、MySQL、PostGreSQL、SQL Server-查詢每秒事務數 在做 db benchmarks 時&#xff0c;qps、tps 是衡量數據庫性能的關鍵指標,TPS : Transactions Per Second 是每秒事務數&#xff0c;即數據庫服務器在單位時間內處理的事務數。 橫向對比計劃幾類數據庫計算tps的方法。 …

微信小程序畢業設計-垃圾分類系統項目開發實戰(附源碼+論文)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;微信小程序畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計…