大家好呀,我是小戴🙌🙌🙌
最近大家不是快期末了嘛,有沒有泡圖書館呀?今天的學習内容跟圖書館有關,沒錯,就是圖書管理系統,但是目前所學知識水準有限,這是一個很簡單的圖書系統小練習。不要急,我們的目的是在于如何使用已知學過的知識進行實踐,這裡将帶大家用基本的Java文法和面向對象的思想來實作這個小程式~沖沖沖🥳🥳🥳
下面是我們今天要學習的内容🥳🥳🥳
🌕一、需求分析
🌕二、具體實作過程
🥝2.1 代碼目錄
🥝2.2 book包
🍊1.Book類
🍊2.BookList類
🥝2.3 operation包
🍊1.接口IOperation
🍊2.AddOperation類
🍊3.BorrowOperation類
🍊4. DelOperation類
🍊5. DisplayOperation類
🍊6. ExitOperation類
🍊7.FindOperation類
🍊8.ReturnOperation類
🥝2.4 user包
🍊1. User類
🍊2. AdminUser類
🍊3. NormalUser類
🥝2.4 Main類
🌕 三、效果展示
🥝示例一
🥝示例二
🌕四、小戴想說的話
🌕一、需求分析
圖書館書籍系統的使用者分為管理者和普通使用者兩種,兩種使用者之間所能實作的功能是不同的。例如我了解想要實作的業務是這樣子的:
管理者:
普通使用者:
業務實作内容不是重點,大家可以根據自己的喜好去進一步完善~
🌕二、具體實作過程
🥝2.1 代碼目錄
建立一個叫booktest的項目,在src下建立book、operation、user 三個包,分别将跟書有關的類、跟操作有關的類、跟使用者有關的類存儲起來。即很好地應用了包的作用。
包的作用:
1.提供了類似于作業系統樹狀檔案夾的組織形式,能分門别類地存儲、管理類,易于查找并使用類;
2.解決了類命名時相同的沖突。在Java中,不能在一個同一個包中定義兩個類名相同的類,但在不同包中可以;
3.保護類中成員變量和方法。該成員變量和方法的使用範圍取決于通路修飾符。
在src下還建立了一個叫Main的類,這個類有一個main方法,并且該類将所有東西進行整合,來實作我們想要完成的功能。
在Java中,main方法是Java應用程式的入口方法。
程式運作時,要執行的第一個方法是main()方法。
🥝2.2 book包
🍊1.Book類
Book類用來具體存放圖書資訊,
包括書名、作者、價格、類型、是否被借出這些基本資訊
由于這些屬性是用private修飾的,這不就展現了Java語言面向對象封裝的特點嗎?除了設定帶參的構造方法、重寫toString()方法,要想在其他類中調用圖書屬性,需要為每個屬性設定Getter和Setter方法
封裝:
将一些細節資訊隐藏- CSDN搜尋起來,對外界不可見
用private修飾的屬性,隻能在本類中随意通路,要想在其他類中調用,需要在類中設定指派或擷取的成員方法。
package book;
public class Book {
private String name;//書名
private String author;//作者
private double price;//價格
private String type;//類型
private boolean isBorrowed;//是否被借出
//Getter Setter方法
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 double getPrice() {
return price;
}
public void setPrice(double 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;
}
//提供一個4個參數的構造方法
public Book(String name, String author, double price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", "+((isBorrowed==true)?"已借出":"未借出") +
'}';
}
}
🍊2.BookList類
存放書的地方,是魔幻小書架,書架上的書可不止隻有一本哦~
建立一個Book類型的數組,并實時記錄目前數組存放了多少本書,
設定一個構造方法,将一些書先存放進去
getBook()和setBook()方法分别相當于從書架上拿書和放書在書架上
package book;
public class BookList {
//書架容量為10本
private Book[] books = new Book[10];
private int usedSize;//實時記錄 目前Books這個數組放了多少本書
//構造方法
public BookList(){
books[0] = new Book("把時間當做朋友","李笑來",59,"勵志");
books[1] = new Book("雲邊有個小賣部","張嘉佳",46,"青春、成長");
books[2] = new Book("山茶文具店","小川糸",52,"治愈");
usedSize = 3;
}
/**
*
* @param pos 此時 pos位置一定是合法的
* @return 是你想要借的一本書
*/
public Book getBook(int pos){
return books[pos];
}
/**
*
* @param pos 此時 pos位置一定是合法的
* @param book 是你想要放的一本書
*/
public void setBooks(int pos,Book book){
books[pos] = book;
}
/**
* 實時擷取目前書架上 書的個數
* @return
*/
public int getUsedSize(){
return usedSize;
}
/**
* 實時修改目前書架上 書的個數
* @param size
*/
public void setUsedSize(int size){
usedSize = size;
}
}
🥝2.3 operation包
跟操作有關的類都在這裡啦~
🍊1.接口IOperation
這個接口中的抽象方法都會在後面實作該接口的類中進行重寫
package operation;
import book.BookList;
public interface IOperation {
void work(BookList bookList);//抽象方法
}
🍊2.AddOperation類
實作新增圖書
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("新增圖書!");
Scanner sc = new Scanner(System.in);
System.out.println("請輸入圖書的名字:");
String name = sc.nextLine();
System.out.println("請輸入圖書的作者:");
String author = sc.nextLine();
System.out.println("請輸入圖書的價格:");
double price = sc.nextDouble();
sc.nextLine();//使用nextLine()接收上面鍵盤輸入的'\n'
System.out.println("請輸入圖書的類型:");
String type = sc.nextLine();
Book book = new Book(name,author,price,type);
int currentSize = bookList.getUsedSize();
bookList.setBooks(currentSize,book);
bookList.setUsedSize(currentSize+1);
System.out.println("《"+name+"》"+"已新增!");
}
}
🍊3.BorrowOperation類
實作借閱圖書
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("借閱圖書!");
Scanner sc = new Scanner(System.in);
System.out.println("請輸入你想要借閱書的名字:");
String name = sc.nextLine();
int currentSize = bookList.getUsedSize();
int i=0;
for(i=0;i<currentSize;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
book.setBorrowed(true);
System.out.println("《"+name+"》借閱成功,祝暢遊閱讀世界!");
return;
}
}
if(i>=currentSize){
System.out.println("抱歉,本書架中沒有此書,我們會盡快聯系圖書管理者新增此書!");
}
}
}
🍊4. DelOperation類
實作删除圖書
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("删除圖書!");
Scanner sc = new Scanner(System.in);
System.out.println("請輸入你想要删除書的名字:");
String name = sc.nextLine();
int i=0;
int index = 0;
int currentSize = bookList.getUsedSize();
for (i=0;i<currentSize;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
index = i;
break;
}
}
if(i>=currentSize){
System.out.println("沒有你想要删除的這本書");
return;
}
for(i=index;i<currentSize-1;i++){
Book book = bookList.getBook(i+1);
bookList.setBooks(i,book);
}
bookList.setBooks(currentSize,null);
bookList.setUsedSize(currentSize-1);
System.out.println("《"+name+"》"+"已删除");
}
}
🍊5. DisplayOperation類
實作顯示圖書
package operation;
import book.Book;
import book.BookList;
public class DisplayOperation implements IOperation{
@Override
public 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);
}
}
}
🍊6. ExitOperation類
實作退出系統
package operation;
import book.BookList;
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系統!");
System.exit(0);
}
}
🍊7.FindOperation類
實作查找圖書
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("查找圖書!");
Scanner sc = new Scanner(System.in);
System.out.println("請輸入書名:");
String name = sc.nextLine();
int currentSize = bookList.getUsedSize();
int i=0;
for(i=0;i<currentSize;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
System.out.println("找到這本書了!");
System.out.println(book);
return;//找到這本書,查找程式提前結束
}
}
if(i>=currentSize) {
//說明沒有找到
System.out.println("沒有你要找的這本書!");
}
}
}
🍊8.ReturnOperation類
實作歸還圖書
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("歸還圖書!");
Scanner sc = new Scanner(System.in);
System.out.println("請輸入你想要歸還書的名字:");
String name = sc.nextLine();
int currentSize = bookList.getUsedSize();
int i=0;
for(i=0;i<currentSize;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
book.setBorrowed(false);
System.out.println("《"+name+"》"+"歸還成功,祝每天都有好心情");
return;
}
}
}
}
🥝2.4 user包
前文提到,使用者類型分為管理者和普通使用者兩種,這兩種類型都有相同的name屬性,都要有一個功能菜單,功能菜單中有相同的操作方法也有各自才有的特殊操作方法,既然重合度這麼高,但又有差別,好喔,這裡需要用一個父類更加友善。
User類就是user這個包中的父類,AdminUser和NormalUser是子類。
繼承的作用:
通過繼承可以快速建立新的類,實作代碼的重用,提高程式的可維護性,節省大量建立新類的時間,提高開發效率和開發品質
允許程式員在保持原有類特性的基礎上進行擴充,增加功能,這樣産生新的類,稱派生類
🍊1. User類
package user;
import book.BookList;
import operation.IOperation;
public abstract class User {
protected String name;//使用者名
protected IOperation[] iOperations;//此時并沒有初始化和配置設定大小
public User(String name) {
this.name = name;
}
public abstract int menu();
public void doOperation(int choice, BookList bookList){
this.iOperations[choice].work(bookList);
}
}
🍊2. AdminUser類
package user;
import book.BookList;
import operation.*;
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 DisplayOperation()
};
}
public int menu(){
System.out.println("hello "+this.name+" 歡迎來到魔幻小書架!");
System.out.println("1.查找書籍");
System.out.println("2.新增書籍");
System.out.println("3.删除書籍");
System.out.println("4.顯示書籍");
System.out.println("0.退出系統");
System.out.println("請輸入你的操作:");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
🍊3. NormalUser類
package user;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation(),
new DisplayOperation()
};
}
public int menu(){
System.out.println("hello "+this.name+" 歡迎來到魔幻小書架!");
System.out.println("1.查找書籍");
System.out.println("2.借閱書籍");
System.out.println("3.歸還書籍");
System.out.println("4.顯示書籍");
System.out.println("0.退出系統");
System.out.println("請輸入你的操作:");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
🥝2.4 Main類
Main類用于将這些功能屬性整合起來,也是整個小項目的執行入口,
使用者登入之後,可選擇自己的身份——(管理者/普通使用者)
菜單用循環實作多次列印
login()函數将AdminUser或者NormalUser向上轉型為父類User
在main()方法中,用一個父類user調用menu()方法,根據user是管理者還是普通使用者,向下轉型調用各自不同的菜單
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login(){
System.out.println("請輸入使用者名:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
System.out.println("請選擇使用者身份:1.管理者 2.普通使用者");
int choice = sc.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();
int temp = 0;
do{
int choice = user.menu();//動态綁定
user.doOperation(choice,bookList);
temp = choice;
}while (temp!=0);
}
}
🌕 三、效果展示
psss:因操作過長,長截圖無法截全,為了保證展示完整性,特意用幾張小圖截的,如果給您帶來閱讀不适,請見諒~給你花花🌹🌹
🥝示例一
🥝示例二
🌕四、小戴想說的話
學習一個知識可能很簡單,但将學到的知識進行整合應用絕對比學那個知識要難,但如果相信自己可以做到,那絕對可以學下去,保持良好的心态是提高學習效率的利器。
咱們一起加油💪💪💪
目前,小戴備考四級和期末考中,有什麼學習心理各方面問題歡迎uu們私信背景踢我,會的我會用心解答~
晚安,唔西迪西!——寫于2022/5/23早1:10
日常秃發,那就明天早上見咯~要是對你有幫助有啟發的話,就淺淺點個贊支援一下吧🌹🌹