目录
整体架构:
代码实现:
package library.book;
import library.user.User;
import java.util.Objects;
public class Book implements Comparable{
public String name;
public String author;
public int price;
public String type;
public String borrowedBy;
@Override
public int compareTo(Object o) {
return name.compareTo(((Book)o).name);
}
public boolean isBorrowed() {
return !borrowedBy.equals("null");
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", borrowedBy='" + borrowedBy + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return price == book.price &&
Objects.equals(name, book.name) &&
Objects.equals(author, book.author) &&
Objects.equals(type, book.type) &&
Objects.equals(borrowedBy, book.borrowedBy);
}
@Override
public int hashCode() {
return Objects.hash(name, author, price, type, borrowedBy);
}
public void borrowed(User user) {
borrowedBy = user.getUsername();
}
}
package library.book;
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
public class BookStorage {
private Book[] array;
private int size;
private static File file = new File("E:\\JAVA\\2022-01-13-javase综合练习\\src\\library\\book\\bookStorage");
public BookStorage() {
array = new Book[20];
size = 0;
}
public boolean add(Book book){
ensureCapacity();
array[size++] = book;
saveToFile();
return false;
}
private void saveToFile() {
try{
PrintWriter pw = new PrintWriter(file,"UTF-8");
for (int i = 0; i < size; i++) {
Book book = array[i];
String s = new String(book.name+"@"+book.author+"@"+book.type+"@"+book.price+"@"+book.borrowedBy);
pw.println(s);
}
pw.flush();
pw.close();
} catch (IOException exc){
exc.printStackTrace();
}
}
private void ensureCapacity() {
if (size>=array.length){
array = Arrays.copyOf(array,array.length*2);
}
}
public Book[] toArray() {
return Arrays.copyOf(array,size);
}
public Book searchByName(String name) {
for (int i = 0; i < size; i++) {
if (array[i].name.equals(name))
return array[i];
}
return null;
}
public void remove(Book book) {
for (int i = 0; i < size; i++) {
if (array[i].equals(book)){
array[i] = array[size-1];
array[size-1] = null;
size--;
break;
}
}
saveToFile();
}
public BookStorage loadFromFile() {
BookStorage bookStorage = new BookStorage();
if (!file.exists()) {
return bookStorage;
}
try {
Scanner sc = new Scanner(file, "UTF-8");
while (sc.hasNextLine()){
String s = sc.nextLine();
String[] split = s.split("@");
Book book = new Book();
book.name = split[0];
book.author = split[1];
book.type = split[2];
book.price = Integer.parseInt(split[3]);
book.borrowedBy = split[4];
bookStorage.add(book);
}
} catch (Exception exc) {
exc.printStackTrace();
}
return bookStorage;
}
}
package library.command;
import library.input.Input;
import library.book.Book;
import library.book.BookStorage;
import library.user.User;
import java.util.Arrays;
import java.util.Comparator;
public abstract class AbsListBookCommand implements IExecutable{
protected abstract Comparator getComparator();
@Override
public void execute(BookStorage bookStorage, User use, Input input) {
Comparator comparator = getComparator();
Book[] books = bookStorage.toArray();
if (comparator == null) {
// 认为按照自然顺序
Arrays.sort(books);
} else {
Arrays.sort(books, comparator);
}
for (Book book : books) {
System.out.println(book.toString());
}
}
}
package library.command;
import library.input.Input;
import library.book.Book;
import library.book.BookStorage;
import library.user.User;
public class AddBookCommand implements IExecutable{
@Override
public void execute(BookStorage bookStorage, User user, Input input) {
System.out.println("开始添加书籍,首先读取书籍信息");
String name = input.promopt("请输入书籍名称:");
String author = input.promopt("请输入作者信息:");
String type = input.promopt("请输入类型信息");
int price;
while (true){
try{
String priceStr = input.promopt("请输入书籍价格:");
price = Integer.parseInt(priceStr);
break;
} catch (NumberFormatException exc){
System.out.println("价格格式错误");
}
}
Book book = new Book();
book.name = name;
book.author = author;
book.type = type;
book.price = price;
book.borrowedBy = null;
System.out.println("将书籍添加到书架上");
bookStorage.add(book);
System.out.println(user.getUsername()+"完成了添加书籍的操作:"+name);
}
@Override
public String getName() {
return "添加书籍";
}
}
package library.command;
import library.input.Input;
import library.book.Book;
import library.book.BookStorage;
import library.user.User;
public class BorrowBookCommand implements IExecutable{
@Override
public void execute(BookStorage bookStorage, User user, Input input) {
System.out.println("开始借阅书籍,首先读取书籍信息:");
String name = input.promopt("请输入书籍名称:");
Book book = bookStorage.searchByName(name);
if (book==null){
System.out.println("没有这本书"+name+"无法借阅");
return;
}
if (book.isBorrowed()){
System.out.println("这本书"+name+"已经被借阅,暂时无法借阅");
return;
}
book.borrowed(user);
System.out.println(user.getUsername()+"完成了借阅书籍的操作:"+name);
}
@Override
public String getName() {
return "借阅书籍";
}
}
package library.command;
import library.input.Input;
import library.book.BookStorage;
import library.user.User;
public interface IExecutable {
void execute(BookStorage bookStorage, User use, Input input);
String getName();
}
package library.command;
import java.util.Comparator;
public class ListBookOrderByNameCommand extends AbsListBookCommand{
@Override
protected Comparator getComparator() {
return null;
}
@Override
public String getName() {
return "根据书名,列出书籍";
}
}
package library.command;
import library.book.Book;
import java.util.Comparator;
public class ListBookOrderByPriceCommand extends AbsListBookCommand{
private final Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Book b1 = (Book)o1;
Book b2 = (Book)o2;
return b1.price-b2.price;
}
};
@Override
protected Comparator getComparator() {
return comparator;
}
@Override
public String getName() {
return "根据书籍价格,列出书籍";
}
}
package library.command;
import library.book.Book;
import java.util.Comparator;
public class ListBookOrederByBorrowedCommand extends AbsListBookCommand{
private final Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Book b1 = (Book)o1;
Book b2 = (Book)o2;
int br1 = b1.borrowedBy==null?0:1;
int br2 = b2.borrowedBy==null?0:1;
return br1-br2;
}
};
@Override
protected Comparator getComparator() {
return comparator;
}
@Override
public String getName() {
return "根据借阅情况,列出书籍";
}
}
package library.command;
import library.input.Input;
import library.book.Book;
import library.book.BookStorage;
import library.user.User;
public class RemoveBookCommand implements IExecutable{
@Override
public void execute(BookStorage bookStorage, User use, Input input) {
System.out.println("开始移除书籍,首先读取要删除的书籍信息:");
String name = input.promopt("请输入书籍名称:");
//首先判断要删除的书籍是否存在
Book book = bookStorage.searchByName(name);
if (book==null){
System.out.println("没有这本书"+name+"无法删除");
return;
}
if (book.isBorrowed()){
System.out.println("这本书"+name+"已经被借走,无法被删除");
return;
}
bookStorage.remove(book);
System.out.println("完成了删除书籍"+name+"的操作");
}
@Override
public String getName() {
return "移除书籍";
}
}
package library.input;
import library.command.IExecutable;
import library.user.User;
import java.util.Scanner;
public class Input {
private final Scanner scanner = new Scanner(System.in);
public String promopt(String promopt) throws QuitException {
System.out.println(promopt + ":");
System.out.print(">");
if (!scanner.hasNextLine()) {
//用户按下cltr+D了
//说明用户想退出
//用异常的方式,向外通知
throw new QuitException();
}
return scanner.nextLine();
}
public IExecutable menuAndSelect(User user) {
IExecutable[] supportedCommands = user.getSupportedCommands();
while (true) {
showMenu(supportedCommands);
String selectStr = promopt("请选择您要进行的操作:");
try {
int select = Integer.parseInt(selectStr);
if (select >= 1 && select <= supportedCommands.length) {
return supportedCommands[select-1];
}
System.out.println("请输入正确的编号");
} catch (NumberFormatException exc) {
System.out.println("请输入数字");
}
}
}
private void showMenu(IExecutable[] supportedCommands) {
System.out.println("=========================================");
for (int i = 0; i < supportedCommands.length; i++) {
System.out.printf(" %2d.%s", i + 1, supportedCommands[i].getName());
}
System.out.println("\n=========================================");
}
}
package library.input;
public class QuitException extends RuntimeException{
}
package library.user;
import library.command.*;
public class AdminUser extends User {
public AdminUser(String usename) {
super(usename);
}
@Override
public IExecutable[] getSupportedCommands() {
return new IExecutable[]{
new AddBookCommand(),
new RemoveBookCommand(),
new ListBookOrederByBorrowedCommand(),
new ListBookOrderByNameCommand(),
new ListBookOrderByPriceCommand()
};
}
}
package library.user;
import library.command.*;
public class CommonUser extends User{
public CommonUser(String usename) {
super(usename);
}
@Override
public IExecutable[] getSupportedCommands() {
return new IExecutable[]{
new BorrowBookCommand(),
new ListBookOrederByBorrowedCommand(),
new ListBookOrderByNameCommand(),
new ListBookOrderByPriceCommand()
};
}
}
package library.user;
import library.command.IExecutable;
public abstract class User {
private String username;
public User(String usename) {
this.username = usename;
}
public String getUsername (){
return username;
}
public abstract IExecutable[] getSupportedCommands();
}
package library.user;
import library.input.Input;
public class UserStorage {
private static final String[] Admin = {
"guanliyuan"
};
public User login(Input input) {
String username = input.promopt("请输入用户名:");
if (isAdmin(username)){
return new AdminUser(username);
} else {
return new CommonUser(username);
}
}
private boolean isAdmin(String username) {
for (int i = 0; i < Admin.length; i++) {
if (username.equals(Admin[i]))
return true;
}
return false;
}
}
package library;
import library.command.IExecutable;
import library.input.Input;
import library.book.BookStorage;
import library.input.QuitException;
import library.user.User;
import library.user.UserStorage;
public class Main {
public static void main(String[] args) {
Input input = new Input();
BookStorage bookStorage = new BookStorage();
bookStorage = bookStorage.loadFromFile();
try {
UserStorage userStorage = new UserStorage();
User user = userStorage.login(input);
while (true){
IExecutable command = input.menuAndSelect(user);
command.execute(bookStorage,user,input);
}
} catch (QuitException exc){
System.out.println("退出程序");
}
}
}