一.抽象出對象:
1.要有書架,圖書,用戶(包括普通用戶,管理員用戶)。根據這些我們可以建立幾個包,來把繁雜的代碼分開,再通過一個類來把這些,對象整合起來實現系統。說到整合,肯定缺不了,相關接口,我們再定義一個,放接口,和擴展這個接口的方法。
如圖:
二.構思:
1.先在書架類上,初始化好默認書籍,其他構造方法(如:getBook,setBook(在具體的下標,放書和返回書)),具體,在寫實現接口的方法時,來增加。
public class BookList {//組合的方式,初始化書架private Book[] books = new Book[10];private int usedSize;//實際放的,書的個數//初始化書架(放書)public BookList() {this.books[0] = new Book("三國演義", "羅貫中", 12, "小說");this.books[1] = new Book("紅樓夢", "曹雪芹", 13, "小說");this.books[2] = new Book("西游記", "吳承恩", 14, "小說");this.usedSize = 3;}//返回一本,pos(要找的書)下標的書public Book getBook(int pos) {return books[pos];}//插入一本書的方法(相當于,要初始化好,書架原來已有的書)public void setBook(int pos, Book books) {this.books[pos] = books;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public Book[] getBooks() {return books;}public void setBooks(Book[] books) {this.books = books;}
}
2.在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*/'}';}
}
3.在User類中,定義好name和,相關構造方法,以及接口命名的數組,為后面,到達調用,擴展了接口的類,里的方法,做鋪墊。
public abstract class User {protected String name;//定義,接口命名,類型的數組,后續配合,// 【return new AdminUser(name);】就可以看出,再加上接口調用的方法,就知道,操作了哪一個方法protected IOperation[] iOperations;//要根據子類,來初始化,父類成員變量public User(String name) {this.name = name;}public abstract int menu();//這里封裝一個方法,提供給,Main調用。public void DoIOperation(int choice, BookList bookList) {//這里,iOperations數組,里有我們要的對象,通過,數組里的對象,調用接口里的方法iOperations[choice].work(bookList);}
}
4.管理員類中(AdminUser)和普通用戶類中(NormalUser)繼承了user類,初始化好系統菜單,相關構造方法。(這個構造方法很關鍵,用接口作為,數組相當于實例化了,擴展了接口的類,的方法,達到調用系統具體方法的作用?)
public class NormalUser extends User{public NormalUser(String name) {super(name);//通過【return new AdminUser(name);】,再加上實現接口的方法,就知道,操作了哪一個方法//登錄界面,選擇了哪個,角色(NormalUser)或者(AdminUser),this就是哪個的引用this.iOperations = new IOperation[] {//這些對象都實現了,iOperations接口,所以不會報錯//下面相當于實例化了,擴展了接口的類,的方法,達到調用系統具體方法的作用new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation(),};}public int menu() {System.out.println("歡迎" + this.name + "使用圖書系統");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);System.out.println("請輸入你的操作:");int choice = scanner.nextInt();return choice;}}
5.在Main類中寫好,登錄界面,及整合一下,如何實例化對象,來操作系統。
public static void main(String[] args) {//實例化書架BookList bookList = new BookList();//通過返回值,向上轉型,確定用戶//這里的user是,返回的(AdminUser),或者(NormalUser)User user = login();while (true) {//然后,通過返回信息,調用恰當的菜單int choice = user.menu();//發生了,動態綁定/*** 根據choice,返回值看看,調用了哪個方法** 1.哪個對象?* 答:User user = login();** 2.哪個方法?-》進一步,還要確定,當前對象,包含了這些方法*答:在構造方法【return new AdminUser(name)】運行時,會初始化好,對應的操作對象。** 注意:后面通過父類對象,調用方法,(int choice = user.menu();),通過choice判斷* 調用了,哪個方法 ,接下來就要對,父類,進行操作*/user.DoIOperation(choice, bookList);}}}
6.初始化好,接口和,菜單里操作系統的work方法(實現了這個接口的,類就是,每個操作系統的方法)
public interface IOperation {//這個接口,有操作書架的方法,在其他類實現,就可以,操作性的區分,不同用戶的方法public void work(BookList bookList);
}
7.接下來就是實現了,接口的每一個類(每個操作系統的方法)
以下是管理員菜單方法:
(1).查找圖書:
public class FindOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("查找圖書");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("請輸入你要查找的圖書");String name = scanner.nextLine();for (int i = 0; i < currentSize; i++) {//遍歷,書架,已初始化的書Book book = bookList.getBook(i);if (book.getName().equals(name)) {System.out.println("找到了");System.out.println(book);return;}}System.out.println("沒有你要找的書...");}
}
(2).新增圖書:
public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {//1.判斷書架(數組)是否滿了int currentSize = bookList.getUsedSize();if (currentSize == bookList.getBooks().length) {System.out.println("該書架滿了,不能放了");return;}//2.構建對象Scanner scanner = new Scanner(System.in);System.out.println("請輸入新增的書名");String name = scanner.nextLine();System.out.println("請輸入新增的作者");String author = scanner.nextLine();System.out.println("請輸入新增的價格");int price = scanner.nextInt();System.out.println("請輸入新增的類型");String type = scanner.next();Book newBook = new Book(name, author, price, type);//3.判斷書架是否,已經存在這本書for (int i = 0; i < currentSize; i++) {//遍歷,書架,已初始化的書Book book = bookList.getBook(i);if (book.getName().equals(name)) {System.out.println("書已經存在了,不用再添加了");return;}}//插入圖書bookList.setBook(currentSize, newBook);bookList.setUsedSize(currentSize+1);}
}
(3).刪除圖書:
public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("刪除圖書");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("請輸入你要刪除的圖書");String name = scanner.nextLine();int pos = 0;int i = 0;for (; i < currentSize; i++) {//遍歷,書架,已初始化的書Book book = bookList.getBook(i);if (book.getName().equals(name)) {//找到要刪除的,位置pos = i;break;}}if (i == currentSize) {System.out.println("沒有找到你要刪除的圖書");}//開始刪除for (int j = pos; j < currentSize-1; j++) {//思路:bookList[j] = bookList[j+1];//先找到j+1,那個位置,然后覆蓋Book book = bookList.getBook(j+1);bookList.setBook(j, book);}//更新下標bookList.setUsedSize(currentSize-1);System.out.println("刪除成功");}
}
(4).顯示圖書:
public class ShowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("顯示圖書");int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {//遍歷下標,把找到的圖書打印出來Book book = bookList.getBook(i);System.out.println(book);}}}
(5).退出系統:
public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系統");System.exit(0);}
}
以下是普通用戶菜單方法:
(1).退出系統和查找圖書,是普通人員和管理員的共同方法
(2)歸還圖書:
public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("歸還圖書");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("請輸入你要歸還的圖書");String name = scanner.nextLine();for (int i = 0; i < currentSize; i++) {//遍歷,書架,已初始化的書Book book = bookList.getBook(i);if (book.getName().equals(name)) {//看看isBorrowed返回,ture(已借出),還是false(未借出)if (book.isBorrowed()) {book.setBorrowed(false);return;}}}System.out.println("錯誤,沒有你要歸還的圖書");}
}
(3)借閱圖書:
public class BorrowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("借閱圖書");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("請輸入你要借閱的圖書");String name = scanner.nextLine();for (int i = 0; i < currentSize; i++) {//遍歷,書架,已初始化的書Book book = bookList.getBook(i);if (book.getName().equals(name)) {//看看isBorrowed返回,ture(已借出),還是false(未借出)if (book.isBorrowed()) {System.out.println("該書已經被借出");return;}book.setBorrowed(true);//置為借出System.out.println("借閱成功");return;}}System.out.println("沒有找到你要借閱的那本書");}
}