框架搭建
book包
將書相關的放到book包中,創建一個Book類用來設置書的屬性,包括書名、作者、價格、類型、是否被借出等。
以上屬性均被private所修飾
利用編譯器生成構造方法(不需要構造isBorrowed,因為其初始值為false,表示為未借出),
生成get、set方法(其中isBorrowed方法生不生成無所謂,以后用不到)
重寫toString方法,用來打印書 屬性
代碼如下:
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=" + isBorrowed +'}';}
}
創建一個BookList類,作為書架
使用數組存放書
public class BookList {private Book[] books = new Book[10];private int useSize;//有效的數據個數【實際存放書的數量】
}
初始容量設為10,不夠的話,后面可以擴容數組
定義一個變量useSize,用來存放實際存放書的數量
再寫一個構造方法,當圖書管理系統運行后,里面默認存放了三本書
public BookList() {books[0] = new Book("三國演義","羅貫中",10,"小說");books[1] = new Book("西游記","吳承恩",20,"小說");books[2] = new Book("紅樓夢","曹雪芹",30,"小說");this.useSize = 3;}
user包
創建一個user包,存放用戶信息
創建一個User類,用來提取用戶的共性屬性,如name
因為name一定會被繼承,所以不建議設置為private,為了代碼有一定的限制,也不能用public,用default修飾只能在同一個包訪問,也不合適,因此用protected來修飾最為合適
再添加一個構造方法,當子類繼承父類時,在子類中幫助父類成員進行初始化
因為User類不能表示某一種具體的用戶類型,所以將User設置為抽象類(abstract),更為合適
tips:抽象類中不一定有抽象方法,但有抽象方法的類一定是抽象類
package user;public abstract class User {protected String name;public User(String name) {this.name = name;}
}
創建一個AdminUser類作為管理員,繼承User
當子類繼承于父類時,父類中的構造方法一定要被調用,父類中的抽象方法一定要被重寫
package user;public class AdminUser extends User {public AdminUser(String name) {super(name);}
}
同理,生成一個NormalUser,普通用戶類
package user;public class NormalUser extends User {public NormalUser(String name) {super(name);}
}
管理員菜單和普通用戶菜單,分別寫在AdminUser和NormalUser
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("********************");Scanner scanner = new Scanner(System.in);System.out.println("請輸入你的操作:");int choice = scanner.nextInt();}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("**********************");Scanner scanner = new Scanner(System.in);System.out.println("請輸入你的操作:");int choice = scanner.nextInt();}
Main函數
創建主函數Main,按照輸入值判斷用戶類型
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static void login() {Scanner scanner = new Scanner(System.in);System.out.println("請輸入你的姓名:");String name = scanner.nextLine();System.out.println("請輸入你的身份,1:管理員 2:普通用戶");int choice = scanner.nextInt();if(choice == 1){return new AdminUser(name);}else{return new NormalUser(name);}}public static void main(String[] args) {}
}
發現返回類型不匹配,如下:
利用向上轉型,通過User作為統一的返回值進行接收,即可解決
在main函數中用User類型變量接收,去調用menu()卻報錯了:
這是因為父類中沒有menu()方法,不能調用子類中的方法
在父類中加一個抽象方法 menu() ,使其發生動態綁定,即可解決
ioperations包
我們的操作都是在書架上,代碼也應寫在BookList中,但這里發現管理員用戶和普通用戶的某些操作是不一樣的(如:同是操作 2 ,一個是新增,一個是借閱),為了方便區分不同用戶類型的操作,我們再創建一個 ioperations 包,在此包內放所有操作
為了區分不同用戶類型的操作,我們創建一個接口IOPeration,在此接口中,設置方法work()
package ioperations;import book.BookList;public interface IOPeration {void work(BookList bookList);
}
然后在其他操作中實現該接口,重寫此方法
package ioperations;import book.BookList;public class AddOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("新增圖書。。。");}
}package ioperations;import book.BookList;public class BorrowedOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("借閱圖書。。。");}
}package ioperations;import book.BookList;public class DelOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("刪除圖書。。。");}
}package ioperations;import book.BookList;public class ExitOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("退出系統。。。");}
}package ioperations;import book.BookList;public class FindOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("查找圖書。。。");}
}package ioperations;import book.BookList;public class ReturnOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("歸還圖書。。。");}
}package ioperations;import book.BookList;public class ShowOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("顯示圖書。。。");}
}
功能判斷選擇
下面將這些操作組織起來,首先要接收返回值,來確認調用哪一個操作
第一步:當用戶選擇管理員或普通用戶之后,這里演示為管理員,將choice值返回用來判斷調用哪一種操作
第二步:將返回值類型設置為int類型
第三步:同時將User父類中的同名方法的返回值類型也改為int(此處是子類重寫父類menu方法)
在main函數中接收返回值,并判斷需調用 哪個對象 的 哪個方法
上圖中,1 操作已經確定 哪個對象,原理如下:
接下來要確定調用 該對象的 哪個方法
第一步,確定當前對象已經包含了這些方法?
User類,通過user調用某個方法,傳入choice,才能知道調用誰,通過user調,定義的東西就該放到user中,
定義一個接口數組:
NormalUser中,構造方法,通過this訪問 ioPerations?
給該數組直接初始化,數組元素為普通用戶中各種操作的類
相當于在子類里面確定了大小,同時初始化了該數組
只要這行代碼執行完,一定會知道數組中有哪些操作
同樣,在 AdminUser 中,初始化該數組,如下:
結論:在調用子類對象的時候,構造方法會初始化好對應的操作對象
具體調用:
main函數中目前四行代碼的具體實現分析:
具體功能實現
下面實現具體功能
退出系統:
設置狀態碼為0即可
書架類BookList其實就是一個數組
我們初始化書架有三本書,通過訪問其下標即可顯示圖書
通過BookList類中的useSize作為數組有效訪問長度,因為useSize修飾符為private
所以需創建get、set方法
來遍歷BookList類中的books數組,該數組也是private所修飾,也需get、set方法
?編譯器自動生成如下:
getBooks不符合我們的需求,我們想要獲取某一個下標的數組,這里返回的是成員變量boosk
改為以下:返回pos下標的書,這里不考慮pos不合法的情況
setBooks也不符合需求,我們要往某一個下標去放一本書,改為如下:往pos下標放一本書
查找圖書
根據書名查找
運行查找“三國演義”
修改重寫的toString方法,使用三目運算符改為借出、未借出
新增圖書
將新增圖書放到數組(順序表)的最后即可,即放到下標為 useSize 的位置
第一步:判滿
第二步:輸入各種成員變量,構建對象
第三步:放到數組最后一個位置
第四步:useSize++
public class AddOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("新增圖書。。。");//1、判滿int currentSize = bookList.getUseSize();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();scanner.nextLine();System.out.println("請輸入書的類型:");String type = scanner.nextLine();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("有這本書,不能插入!");System.out.println(book);return;}}//4、插入新增書bookList.setBook(currentSize,newBook);bookList.setUseSize(currentSize+1);System.out.println("新增圖書成功!");}
}
具體實現分析
1、book數組由private修飾,無法被外部訪問,所以寫一個get方法
定義變量currentSize接收當前數組實際占用空間
獲取數組長度與實際占用空間相比較
2、構建書對象?
3、遍歷數組,比較有無同名書
4、新增圖書
將書添加到數組中currentSize下標處,currentSize+1
普通用戶專屬借閱圖書:
?歸還圖書:
?刪除圖書
本章示例代碼
book包
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 +'}';}
}package book;public class BookList {private Book[] books = new Book[10];private int useSize;//有效的數據個數【實際存放書的數量】public BookList() {books[0] = new Book("三國演義","羅貫中",10,"小說");books[1] = new Book("西游記","吳承恩",20,"小說");books[2] = new Book("紅樓夢","曹雪芹",30,"小說");this.useSize = 3;}public int getUseSize() {return useSize;}public void setUseSize(int useSize) {this.useSize = useSize;}public Book getBook(int pos) {return books[pos];}public void setBook(int pos, Book book) {this.books[pos] = book;}public Book[] getBooks() {return books;}
}
ioperations包
package ioperations;import book.BookList;import java.util.Scanner;import book.Book;
public class AddOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("新增圖書。。。");//1、判滿int currentSize = bookList.getUseSize();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();scanner.nextLine();System.out.println("請輸入書的類型:");String type = scanner.nextLine();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("有這本書,不能插入!");System.out.println(book);return;}}//4、插入新增書bookList.setBook(currentSize,newBook);bookList.setUseSize(currentSize+1);System.out.println("新增圖書成功!");}
}package ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowedOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("借閱圖書。。。");Scanner scanner = new Scanner(System.in);System.out.print("請輸入要借閱的書名:");String name = scanner.nextLine();int currentSize = bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(name)){if(book.isBorrowed()) {System.out.println("這本書已借出!");return;}book.setBorrowed(true);System.out.println("借閱成功!");return;}}System.out.println("沒找到你要借閱的書。。。");}
}package ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class DelOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("刪除圖書。。。");Scanner scanner = new Scanner(System.in);System.out.print("請輸入你要刪除的書名:");String name = scanner.nextLine();int currentSize = bookList.getUseSize();int pos = -1;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("沒有你要刪除的書!");return;}for(int j = pos;j < currentSize-1;j++){//錯誤示例://bookList[j] = bookList[j+1];Book book = bookList.getBook(j+1);bookList.setBook(j,book);}bookList.setBook(currentSize-1,null);bookList.setUseSize(currentSize-1);System.out.println("刪除成功!");}
}package ioperations;import book.BookList;public class ExitOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("退出系統。。。");System.exit(0);}
}package ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("查找圖書。。。");Scanner scanner = new Scanner(System.in);System.out.print("請輸入要查找的書名:");String name = scanner.nextLine();int currentSize = bookList.getUseSize();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("沒找到你要查找的書。。。");}
}package ioperations;import book.BookList;public interface IOPeration {void work(BookList bookList);
}package ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class ReturnOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("歸還圖書。。。");Scanner scanner = new Scanner(System.in);System.out.print("請輸入要歸還的書名:");String name = scanner.nextLine();int currentSize = bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(name)){if(book.isBorrowed()) {book.setBorrowed(false);System.out.println("歸還成功!");return;}}}System.out.println("沒有你要歸還的圖書!");}
}package ioperations;import book.Book;
import book.BookList;public class ShowOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("顯示圖書。。。");int currentSize = bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);System.out.println(book);//錯誤示例://Book book = bookList[i];}}
}
user包
package user;import ioperations.*;import java.util.Scanner;public class AdminUser extends User {public AdminUser(String name) {super(name);this.ioPerations = new IOPeration[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation()};}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("4. 顯示圖書");System.out.println("0. 退出系統");System.out.println("********************");Scanner scanner = new Scanner(System.in);System.out.println("請輸入你的操作:");int choice = scanner.nextInt();return choice;}
}package user;import ioperations.*;import java.util.Scanner;public class NormalUser extends User {public NormalUser(String name) {super(name);this.ioPerations = new IOPeration[]{new ExitOperation(),new FindOperation(),new BorrowedOperation(),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;}
}package user;import book.BookList;
import ioperations.IOPeration;public abstract class User {protected String name;//此時這個數組沒有初始化protected IOPeration[] ioPerations;public User(String name) {this.name = name;}public abstract int menu();public void doIoperation(int choice, BookList bookList){ioPerations[choice].work(bookList);}
}
Main函數
import book.BookList;
import ioperations.IOPeration;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User login() {Scanner scanner = new Scanner(System.in);System.out.println("請輸入你的姓名:");String name = scanner.nextLine();System.out.println("請輸入你的身份,1:管理員 2:普通用戶");int choice = scanner.nextInt();if(choice == 1){return new AdminUser(name);}else{return new NormalUser(name);}}public static void main(String[] args) {BookList bookList = new BookList();User user = login();while(true) {int choice = user.menu();//要根據這個返回值來看調用 哪個對象 的 哪個方法user.doIoperation(choice, bookList);}}
}
擴展功能
將書籍數據存儲到文件中
將書籍數據存儲到MySQL中
加入網頁、框架,實現web端
功能上按書名、作者名、價格等排序