javase综合实战之图书管理系统(用面向对象的思想来实现)

目录

整体架构:

 代码实现:

整体架构:


 代码实现:

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("退出程序");
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值