目錄
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)