一、代码解析
package book; public class book { private String name; private String author;//作者 private int price; private String type; private boolean inBorrowed; 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 isInBorrowed() { return inBorrowed; } public void setInBorrowed(boolean inBorrowed) { this.inBorrowed = inBorrowed; } @Override public String toString() { return "book{" + "name='" + name + '\'' + ", author='" + author + '\'' + ", price=" + price + ", type='" + type + '\'' + ", inBorrowed=" + inBorrowed + '}'; } }
-
book
类: -
属性:
name
: 书名author
: 作者price
: 价格type
: 类型inBorrowed
: 标志书籍是否被借阅
-
方法:
getName()
,setName(String)
: 获取或设置书名getAuthor()
,setAuthor(String)
: 获取或设置作者getPrice()
,setPrice(int)
: 获取或设置价格getType()
,setType(String)
: 获取或设置类型isInBorrowed()
,setInBorrowed(boolean)
: 获取或设置借阅状态toString()
: 将书籍信息以字符串形式返回
package book; import java.awt.print.Book; public class bookList { private book[] books; private int usedSize;//记录当前所拥有书籍 public bookList() { this.books=new book[10]; this.usedSize=3; this.books[0]= new book("三国","罗贯中",10,"小说"); this.books[1]=new book("西游","吴承恩",10,"小说"); this.books[2]=new book("红楼梦","曹雪芹",19,"小说"); } public int getUsedSize(){ return usedSize; } public void setUsedSize(int usedSize){ this.usedSize=usedSize; } public book getBook(int pos){ return books[pos]; } public void setBook(book book1,int pos){ books[pos]=book1; } }
bookList
类:
-
属性:
books
: 书籍数组usedSize
: 记录当前拥有书籍数量
-
方法:
getUsedSize()
: 获取已使用槽位数量setUsedSize(int)
: 设置已使用槽位数量getBook(int)
: 获取指定位置的书籍setBook(book, int)
: 在指定位置设置书籍
package operation; import book.bookList; public interface IOperation { void work(bookList bookList1); }
IOperation
接口:
- 定义了一个
work
方法,接受一个bookList
参数,用于执行具体的操作。
package operation; import book.book; import book.bookList; import java.awt.print.Book; import java.util.Scanner; public class AddOperation implements IOperation { public void work(bookList bookList1){ System.out.println("新增图书:"); 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.nextLine(); book book1=new book(name,author,price,type); int currentSize=bookList1.getUsedSize(); for (int i = 0;i<currentSize;i++){ book tmp=bookList1.getBook(i); if(tmp.getName().equals(name)){ System.out.println("存在该书,无法新增"); return; } } bookList1.setBook(book1,currentSize); bookList1.setUsedSize(currentSize+1); } }
AddOperation
类:
work
方法:- 实现了
IOperation
接口的方法,用于向书籍列表中添加新书。 - 提示用户输入书籍信息(名字、作者、价格、类型)。
- 检查是否已存在同名书籍,如果是,则提示无法添加。
- 否则,将新书添加到书籍列表。
- 实现了
package operation; import book.*; import java.util.Scanner; public class BorrowOperation implements IOperation { public void work(bookList bookList1){ Scanner scanner=new Scanner(System.in); System.out.println("借阅图书:"); System.out.println("请输入借阅的书名:"); String name=scanner.nextLine(); int currentSize=bookList1.getUsedSize(); for (int i=0;i<currentSize;i++){ book book1=bookList1.getBook(i); if(book1.getName().equals(name)){ if(book1.isInBorrowed()==false) { book1.setInBorrowed(true); return; } else { System.out.println("已经被借阅"); return; } } } System.out.println("未找到图书"); return; } }
BorrowOperation
类:
work
方法:- 实现了
IOperation
接口的方法,用于借阅图书。 - 提示用户输入要借阅的书籍名字。
- 检查图书列表中是否存在该书籍,若存在,检查是否已被借阅。
- 如果未被借阅,则设置图书状态为借阅;否则,提示该书已被借阅。
- 实现了
package operation; import book.book; import book.bookList; import java.util.Scanner; public class DelOperation implements IOperation{ public void work(bookList bookList1){ int i=0; int index=-1; System.out.println("删除"); Scanner scanner=new Scanner(System.in); System.out.println("请输入删除的书名:"); String name=scanner.nextLine(); int currentSize=bookList1.getUsedSize(); for (i = 0;i<currentSize;i++){ book book1=bookList1.getBook(i); if(book1.getName().equals(name)){ index=i; break; } } if(i>=currentSize){ System.out.println("找不到该书"); return; } for (int j=i;j<currentSize-1;j++){ book book2=bookList1.getBook(j+1); bookList1.setBook(book2,j); } bookList1.setUsedSize(currentSize-1); return; } }
DelOperation
类:
work
方法:- 实现了
IOperation
接口的方法,用于删除图书。 - 提示用户输入要删除的书籍名字。
- 检查图书列表中是否存在该书籍,若存在,则删除该书籍;否则,提示未找到该书。
- 实现了
package operation; import book.bookList; public class ExitOperation implements IOperation{ public void work(bookList bookList1){ System.out.println("退出"); System.exit(0); } }
ExitOperation
类:
work
方法:- 实现了
IOperation
接口的方法,用于退出系统。 - 调用
System.exit(0)
终止程序。
- 实现了
package operation; import book.*; import java.util.Scanner; public class FindOperation implements IOperation{ public void work(bookList bookList1){ System.out.println("查找"); System.out.println("请输入你要查找的书名:"); Scanner scanner=new Scanner(System.in); String name=scanner.nextLine(); int currentSize=bookList1.getUsedSize(); for (int i=0;i<currentSize;i++){ book book1=bookList1.getBook(i); if(book1.getName().equals(name)){ System.out.println("存在该书,信息:"); System.out.println(book1); return; } } System.out.println("未找到"); return; } }
FindOperation
类:
FindOperation
类中的 work
方法的功能是实现了 IOperation
接口的方法,用于查找书籍信息。以下是该方法的详细解析:
package operation; import book.book; import book.bookList; import java.util.Scanner; public class ReturnOperation implements IOperation{ public void work(bookList bookList1){ Scanner scanner=new Scanner(System.in); System.out.println("归还图书:"); System.out.println("请输入归还的书名:"); String name=scanner.nextLine(); int currentSize=bookList1.getUsedSize(); for (int i=0;i<currentSize;i++){ book book1=bookList1.getBook(i); if(book1.getName().equals(name)){ if(book1.isInBorrowed()==true) { book1.setInBorrowed(false); return; } else { System.out.println("已经被归还"); return; } } } System.out.println("未找到图书"); return; } }
ReturnOperation
类:
work
方法:- 实现了
IOperation
接口的方法,用于归还图书。 - 提示用户输入要归还的书籍名字。
- 检查图书列表中是否存在该书籍,若存在,检查是否已被借阅。
- 如果已被借阅,则设置图书状态为未借阅;否则,提示该书未被借阅。
- 实现了
package operation; import book.*; public class ShowOperation implements IOperation{ public void work(bookList bookList1){ System.out.println("显示图书:"); int currentSize=bookList1.getUsedSize(); for (int i=0;i<currentSize;i++){ book book1=bookList1.getBook(i); System.out.println(book1); } } }
ShowOperation
类:
work
方法:- 实现了
IOperation
接口的方法,用于显示所有图书信息。 - 遍历图书列表,输出每本书籍的信息。
- 实现了
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 bookList1){ this.iOperations[choice].work(bookList1); } }
User 抽象类:
- 构造方法:接收用户的姓名,初始化用户的姓名。
menu
抽象方法:由子类实现,用于显示用户的菜单并返回用户选择的操作。doOperation
方法:接收用户选择的操作和图书列表,调用相应操作的work
方法进行处理。
package user; 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 ShowOperation() }; } 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("***********************"); System.out.println("请输入你的操作:"); Scanner scanner=new Scanner(System.in); int choice=scanner.nextInt(); return choice; } }
AdminUser 类:
- 构造方法:接收管理员的姓名,调用父类 User 的构造方法,初始化该用户的操作数组
iOperations
,包括退出系统、查找图书、新增图书、删除图书和显示图书等操作。 menu
方法:显示管理员用户的菜单,包括查找图书、新增图书、删除图书、显示图书和退出系统的选项,然后接收用户输入的操作选项。
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() }; } 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("**********************"); System.out.println("请输入你的操作:"); Scanner scanner=new Scanner(System.in); int choice=scanner.nextInt(); return choice; } }
NormalUser 类:
- 构造方法:接收普通用户的姓名,调用父类 User 的构造方法,初始化该用户的操作数组
iOperations
,包括退出系统、查找图书、借阅图书和归还图书等操作。 menu
方法:显示普通用户的菜单,包括查找图书、借阅图书、归还图书和退出系统的选项,然后接收用户输入的操作选项。
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 scanner=new Scanner(System.in); 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 bookList1=new bookList(); User user=login(); while (true) { int choice = user.menu(); user.doOperation(choice, bookList1); } } }
Main 类:
login
方法:用于用户登录,接收用户输入姓名和身份(管理员或普通用户),根据输入创建相应的用户对象并返回。main
方法:主程序入口,创建图书列表对象,调用login
方法获取用户对象,然后进入循环,不断显示用户菜单、接收用户操作、执行相应的操作,直到用户选择退出系统。
二、代码运行过程解析
-
程序启动:
- 创建
bookList1
对象,该对象初始化了一个包含三本书的书籍列表。 - 调用
login
方法,提示用户输入姓名和身份(管理员或用户)。 - 根据用户的选择创建相应的用户对象,包括
AdminUser
和NormalUser
。
- 创建
-
用户登录后:
- 进入
while
循环,不断显示用户的菜单和接收用户的选择。 - 用户的菜单包括查找图书、新增图书、删除图书、显示图书、退出系统等选项。
- 进入
-
用户选择操作:
- 用户输入选择后,调用
doOperation
方法执行相应的操作。该方法会调用对应操作的work
方法。 - 例如,如果用户选择新增图书(AddOperation),则执行
AddOperation
的work
方法,提示用户输入书籍信息,并将新书添加到书籍列表。
- 用户输入选择后,调用
-
循环进行:
- 循环会一直进行,直到用户选择退出系统(ExitOperation)。
- 如果用户退出系统,调用
System.exit(0)
终止程序运行。