首先還是來看看運行的效果
我們來分析一下:
Java中是透過物件之間的互動來解決事情的,所以我們來看看有哪些物件
首先顯而易見的兩個物件:使用者和書,所以建立兩個套件book和user
透過上圖可以看到:不同使用者之間有相同的操作,也有不同的操作,所以不妨將所有的操作都放在一個套件中,需要什麼操作直接呼叫即可,我將這個套件命名為operate
首先包中肯定需要有一個Book類,此類中記錄數的各種信息,包括書名、作者、書的類型、價格和借閱狀態,所有套件中的所有類別中的成員變數我都使用private修飾,只提供對外的方法,後面就不再重複,程式碼如下(只展示部分程式碼):
package book; public class Book { private String name; private String author; private String type; private int price; private boolean borrow; 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; } }
既然有書,那麼就需要書架來存放書,所以在book包中再定義一個類為BookShelf用來存放書以及記錄書的數量,存放書可以用Book類數組實現
public class BookShelf { private Book[] books=new Book[1000]; private int count; //记录书的数量 }
由於數組不能直接訪問,所以在類中增加一個取得陣列下標的方法,而存取陣列的方法一般都是對書進行操作,所以setBook方法也進行修改
package book; public class BookShelf { private Book[] books=new Book[1000]; private int count; //记录书的数量 public void setBooks(int pos,Book book) { books[pos] = book; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public BookShelf() { books[0]=new Book("呐喊","鲁迅","小说集",30); //默认初始有一本书,写不写随你 this.count=1; } //获取下标对应的书 public Book pos(int i) { return books[i]; } }
book套件初步的程式碼就到這,繼續下一個套件
包中肯定會有普通用戶(NormalUser)和管理員(AdminUser)兩個類,但重點是如何實現圖中的不同用戶有不同的操作
那我們先將登陸方法寫出來,然後分析:
public static void login() { System.out.println("输入姓名:"); Scanner scanner=new Scanner(System.in); String name=scanner.nextLine(); System.out.println("输入你身份:1.管理员 2.普通用户"); int i=scanner.nextInt(); if(i==1) { //管理员 } else { //普通用户 } }
方法根據不同的數字來判斷是哪種用戶,所以返回值應該是返回一個類,但這裡有兩個類,為解決這個問題,我們可以讓NormalUser和AdminUser都繼承同一個父類,方法只要回傳父類即可
父類代碼如下:
public abstract class User { private String name; public User(String name) { this.name = name; } public abstract void menu(); //菜单抽象方法,子类实现 }
子類代碼:
public class AdminUser extends User{ public AdminUser(String name) { super(name); } @Override public void 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("选择操作"); } } public class NormalUser extends User{ public NormalUser(String name) { super(name); } @Override public void menu() { System.out.println("欢迎使用"); System.out.println("1.查找图书"); System.out.println("2.借阅图书"); System.out.println("3.归还图书"); System.out.println("0.退出系统"); System.out.println("选择操作"); } }
不同使用者對應著不同的操作,但有相同的操作數,所以兩個類別需要有一個陣列來存放各自的方法來防止出錯,而且這個陣列是要在使用者選擇之前就準備好,所以陣列應該是在建構方法內,修改後的類別如下:
public abstract class User { private String name; public IOperate[] ioperate; public void chooseOperate(int choice,BookShelf bookShelf) { ioperate[choice].work(bookShelf); } public User(String name) { this.name = name; } public abstract int menu(); } public class AdminUser extends User{ public AdminUser(String name) { super(name); this.ioperate=new IOperate[] { new Exit(), new FindBook(), new AddBook(), new DelBook(), new DisplayBook(), }; } @Override public 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("选择操作"); Scanner scanner=new Scanner(System.in); int choice=scanner.nextInt(); return choice; } } public class NormalUser extends User{ public NormalUser(String name) { super(name); this.ioperate=new IOperate[] { new Exit(), new FindBook(), new BorrowBook(), new ReturnBook(), }; } @Override public int menu() { System.out.println("欢迎使用"); System.out.println("1.查找图书"); System.out.println("2.借阅图书"); System.out.println("3.归还图书"); System.out.println("0.退出系统"); System.out.println("选择操作"); Scanner scanner=new Scanner(System.in); int choice=scanner.nextInt(); return choice; } }
圖書的增刪改查等操作其實都是在對Book陣列來進行操作的,所以這些方法的參數都是BookShelf類,那麼我們可以定義一個接口,接口內定義此方法,然後其它類實現此接口即可
接口代碼:
package operate; import book.BookShelf; public interface IOperate { public void work (BookShelf bookShelf); }
至於對書的操作,這裡以增加書籍為例
我們需要知道書的訊息,然後要有一個Book類別來接收,最後放到陣列中
按照這個邏輯,之前的Book類別就需要修改:在Book類別中加入一個建構方法以便接收書的訊息,注意方法在陣列中的位置要和你自己寫的選單中的位置對應
public Book(String name, String author, String type, int price) { this.name = name; this.author = author; this.type = type; this.price = price; }
增加書的方法程式碼:
public class AddBook implements IOperate { @Override public void work(BookShelf bookShelf) { System.out.println("请输入图书的名字:"); Scanner scanner = new Scanner(System.in); 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 book = new Book(name,author,type,price); int count=bookShelf.getCount(); bookShelf.setBooks(count,book); bookShelf.setCount(count+1); System.out.println("新增成功"); } }
註:
1.由於引用變數預設是輸出修改的位址,所以要列印書的內容的話需要在類別Book中重寫toString方法
2 .退出方法在退出前需遍歷數組將其指向的對像都改為null方便回收,雖然程序結束後系統也會回收,但你要知道大型工程裡面有些程序一旦跑起來後想要停下來不是那麼容易的
以上是Java圖書管理基本功能代碼怎麼寫的詳細內容。更多資訊請關注PHP中文網其他相關文章!