Implementação de sistema de gerenciamento de bibliotecas por simulação Java

1. Bolsa de livro

Abstraia as classes relacionadas aos livros, crie um pacote de livros e escreva essas classes no pacote de livros.

1.1 Aula de livro

Defina várias propriedades da classe Book. Essas propriedades são encapsuladas aqui. Observe que o valor inicial da propriedade de empréstimo é false. O método de construção atribui valores a propriedades diferentes da propriedade de empréstimo. O método de construção tem parâmetros e, em seguida, reescreve o método toString da classe Object (alterou a saída de empréstimo).

package book;
public class Book {
    
    
    private String name;
    private String autor;
    private int price;
    private String type;
    private boolean borrow;
    public String getName() {
    
    
        return name;
    }
    public void setName(String name) {
    
    
        this.name = name;
    }
    public String getAutor() {
    
    
        return autor;
    }
    public void setAutor(String autor) {
    
    
        this.autor = autor;
    }
    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 getBorrow() {
    
    
        return borrow;
    }
    public void setBorrow(Boolean borrow) {
    
    
        this.borrow = borrow;
    }
    public Book (String name, String autor, int price, String type){
    
    
        this.name = name;
        this.autor = autor;
        this.price = price;
        this.type = type;
    }
    @Override
    public String toString() {
    
    
        return "Book{" +
                "name='" + name + '\'' +
                ", autor='" + autor + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ((borrow == true) ? "已被借出":"未被借出") +
                '}';
    }
}

1.2 Classe BookList

O atributo possui um array do tipo Livro (aqui, o tamanho do array é 10), o número de livros e encapsula esses atributos. No método de construção, use a palavra-chave new para criar três objetos, atribua esses três objetos aos três primeiros elementos da matriz do tipo Livro e atribua o número de livros a três, e o método de construção não possui parâmetros.

package book;
public class BookList {
    
    
    private Book[] bookList = new Book[10];
    private int booknumbers;
    public Book getBook(int pos) {
    
    
        return bookList[pos];
    }
    public void setBook(int pos, Book book) {
    
    
        bookList[pos] = book;
    }
    public int getBooknumbers() {
    
    
        return booknumbers;
    }
    public void setBooknumbers(int booknumbers) {
    
    
        this.booknumbers = booknumbers;
    }
    public BookList(){
    
    
        this.bookList[0] = new Book("西游记", "吴承恩", 100, "小说");
        this.bookList[1] = new Book("红楼梦", "曹雪芹", 100, "小说");
        this.bookList[2] = new Book("爆笑校园", "朱斌", 20, "漫画");
        this.booknumbers = 3;
    }
}

Dois, pacote de usuário

Abstraia as classes relacionadas aos usuários e coloque essas classes no pacote de usuário criado.

2.1 Classe de usuário

Os atributos da classe User incluem o nome do usuário e uma matriz de tipos de interface de operação (usada para armazenar várias operações). O construtor parametrizado atribui o nome de usuário. Em seguida, escreva o método de menu abstrato e as subclasses que herdam a classe User devem reescrever o método de menu abstrato. Por fim, escreva o método de operação doOperate. Nesse método, o método de trabalho na interface reescrita é chamado com o elemento correspondente ao subscrito da matriz do tipo de interface de operação. O método de trabalho é um método na interface de operação reescrita na classe de operação que implementa a interface de operação. O subscrito correspondente à matriz de tipo de interface de operação é selecionado pelo operador.

package user;
import book.BookList;
import operate.IOperation;
public abstract class User {
    
    
    protected String name;
    public IOperation[] iOperation;
    public User(String name){
    
    
        this.name = name;
    }
    public abstract int menu();
    public void doOperate(int choice, BookList bookList){
    
    
        iOperation[choice].work(bookList);
    }
}

2.2 Classe AdminUser

A classe AdminUser herda a classe User. No método de construção desta classe, primeiro use super() para construir o atributo de nome de usuário da classe pai e, em seguida, inicialize a matriz do tipo de interface de operação. O método de construção tem parâmetros. Após a identidade ser selecionada, várias operações (elementos de matriz) serão criadas. O tipo do elemento de matriz são os vários tipos de classe de operação que implementam a interface de operação. Em seguida, reescreva o método de menu, o valor de retorno do método de menu é um tipo inteiro, que é usado para refletir a escolha do operador.

package user;
import operate.*;
import java.util.Scanner;
public class AdminUser extends User{
    
    
    public AdminUser(String name) {
    
    
        super(name);
        this.iOperation = new IOperation[]{
    
    //选好身份之后,各种操作就会被new好
                new ExitOperate(),
                new FindOperate(),
                new AddOperate(),
                new DelOperate(),
                new ShowOperate()
        };
    }
    @Override
    public int menu() {
    
    
        System.out.println(this.name + " 欢迎来到管理员用户菜单");
        System.out.println("1.查找图书");
        System.out.println("2.新增图书");
        System.out.println("3.删除图书");
        System.out.println("4.显示图书");
        System.out.println("0.退出系统");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

2.3 Classe NormalUser

A classe NormalUser é semelhante à classe AdminUser e também é herdada da classe User. Diferente da classe AdminUser, o método de construção da classe NormalUser cria diferentes objetos de classe de operação ao inicializar a matriz de tipos de interface de operação, e as várias opções no método de menu reescrito também são diferentes.

package user;
import operate.*;
import java.util.Scanner;
public class NormalUser extends User{
    
    
    public NormalUser(String name) {
    
    
        super(name);
        this.iOperation = new IOperation[]{
    
    //选好身份之后,各种操作就会被new好
                new ExitOperate(),
                new FindOperate(),
                new BorrowOperate(),
                new ReturnOperate(),
        };
    }
    @Override
    public int menu() {
    
    
        System.out.println(this.name + " 欢迎来到普通用户菜单");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出系统");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

3. A classe Main_ que implementa a lógica em execução

Primeiro, crie um objeto do tipo BookList. Neste momento, os três livros na estante foram carregados e, em seguida, chame o método login no loop while. O tipo de valor de retorno do método login é User. No método login, se o operador selecionar um administrador, um objeto do tipo administrador (tipo AdminUser) será criado; se um leitor for selecionado, um objeto do tipo usuário normal (tipo NormalUser) será criado. Objetos de várias classes de ação para os tipos correspondentes de usuários. Atribua o tipo de administrador criado ou o objeto de tipo de usuário normal como o valor de retorno do método de login para o usuário variável do tipo de usuário e uma transformação ascendente ocorre aqui. O método de menu é chamado pelo usuário e a ligação dinâmica ocorre aqui, porque a classe AdminUser e a classe NormalUser reescrevem o método de construção da classe de usuário e, em seguida, atribuem o resultado à escolha da variável inteira. Use o usuário para chamar o método de operação doOperate. Qual tipo de objeto de classe de operação do usuário é inicializado e qual método de operação de qual tipo de usuário chamar pode ser determinado por escolha.

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main_ {
    
    
    public User login(){
    
    
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String name = scanner.nextLine();
        System.out.println("请选择身份:0-->管理员 1-->读者");
        int chose = scanner.nextInt();
        if(chose == 0){
    
    
            return new AdminUser(name);
        }else {
    
    
            return new NormalUser(name);
        }
    }
    public static void main(String[] args) {
    
    
        BookList bookList = new BookList();
        Main_ main = new Main_();
        while (true){
    
    
            User user = main.login();//向上转型
            int choice = user.menu();//动态绑定
            user.doOperate(choice, bookList);
        }
    }
}

Quatro, operar o pacote

Abstraia várias operações em uma classe e use interfaces para padronizar as funções dessas classes. No momento, essas classes de operação só precisam implementar essa interface e gravar essa interface de operação e essas classes de operação no pacote de operação criado.

4.1 Interface IOperation

Escrevi um método de trabalho cujo tipo de valor de retorno é vazio e cujo parâmetro é uma variável do tipo BookList (BookList bookList). Como várias operações precisam usar o conteúdo da classe bookshelf, BookList bookList é usado como parâmetro. Esse método é um método abstrato e a classe de operação que implementa essa interface deve reescrever esse método.

package operate;
import book.BookList;
public interface IOperation {
    
    
    void work(BookList bookList);
}

4.2 classe AddOperate

A classe AddOperate implementa a interface IOperation e reescreve o método de trabalho na interface IOperation. No método de trabalho reescrito, insira o título, autor, preço e tipo do livro a ser adicionado. Crie um objeto do tipo Livro, coloque o título, o autor, o preço e o tipo do livro a ser adicionado ao construtor do objeto do tipo Livro recém-criado como parâmetros, coloque esse objeto no conteúdo da matriz do livro com o número do livro atual como subscrito (porque o subscrito da matriz do livro começa em 0) e, em seguida, +1 o número do livro atual.

package operate;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperate implements IOperation{
    
    
    @Override
    public void work(BookList bookList) {
    
    
            Scanner scanner = new Scanner(System.in);
            System.out.println("输入要增加的书的书名");
            String name = scanner.nextLine();
            System.out.println("输入要增加的书的作者");
            String autor = scanner.nextLine();
            System.out.println("输入要增加的书的价格");
            int price = scanner.nextInt();
            scanner.nextLine();
            System.out.println("输入要增加的书的类型");
            String type = scanner.nextLine();
            int currentNums = bookList.getBooknumbers();
            Book book = new Book(name, autor, price, type);
            bookList.setBook(currentNums, book);
            bookList.setBooknumbers(currentNums + 1);
            System.out.println("新增图书成功");
    }
}

4.3 classe BorrowOperate

Digite o nome do livro a ser emprestado e percorra as estantes. Se o livro for encontrado e a propriedade de empréstimo do livro for verdadeira, o livro foi emprestado. Caso contrário, a propriedade de empréstimo do livro é alterada para verdadeira e o empréstimo é bem-sucedido. Se o livro não for encontrado, o livro não existe.

package operate;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowOperate implements IOperation{
    
    
    @Override
    public void work(BookList bookList) {
    
    
        System.out.println("请输入你要借阅的图书的名字");
        Scanner scanner = new Scanner(System.in);
        String bookName = scanner.nextLine();
        int currentNums = bookList.getBooknumbers();
        for (int i = 0; i < currentNums; i++) {
    
    
            if(bookList.getBook(i).getName().equals(bookName)) {
    
    
                if((bookList.getBook(i).getBorrow()) != true) {
    
    
                    bookList.getBook(i).setBorrow(true);
                    System.out.println("借阅图书成功");
                }else {
    
    
                    System.out.println("这本书已被借走");
                }
                return;
            }
        }
        System.out.println("没有你要借阅的图书");
    }
}

4.4 classe DelOperate

A classe Deloperate implementa a interface ioperative, reescreve o método word da interface ioperative, insere o título do livro para excluir o livro e percorre a estante (array de livros). Se você encontrar um livro a ser excluído, registre o lance deste livro. O livro é dado a I como um livro. Para evitar que o array ultrapasse a fronteira, o número de operações realizadas por esta operação é o número atual de livros-1 vezes. Se o livro a ser excluído não for encontrado, o livro a ser excluído não existe.

package operate;
import book.BookList;
import java.util.Scanner;
public class DelOperate implements IOperation{
    
    
    @Override
    public void work(BookList bookList) {
    
    
        System.out.println("请输入你要删除的图书的名字");
        Scanner scanner = new Scanner(System.in);
        String bookName = scanner.nextLine();
        int currentNums = bookList.getBooknumbers();
        int target = -1;
        for (int i = 0; i < currentNums; i++) {
    
    
            if(bookList.getBook(i).getName().equals(bookName)) {
    
    
                target = i;
                break;
            }
        }
        if(target == -1) {
    
    
            System.out.println("没有你要删除的书");
        }
        for (int i = target; i < currentNums - 1; i++) {
    
    
            bookList.setBook(i, bookList.getBook(i + 1));
        }
        bookList.setBooknumbers(currentNums - 1);
        System.out.println("删除图书成功");
    }
}

4.5 Sair da classe Operate

A classe ExitOperate implementa a interface IOperation, reescreve o método word da interface IOperation e usa System.exit(0); para sair do programa. Antes de sair do programa, os livros na estante (o conteúdo da matriz de livros) são definidos como nulos e o número atual de livros é definido como 0.

package operate;
import book.BookList;
public class ExitOperate implements IOperation{
    
    
    @Override
    public void work(BookList bookList) {
    
    
        int currentNums = bookList.getBooknumbers();
        for (int i = 0; i < currentNums; i++) {
    
    
            bookList.setBook(i, null);
        }
        bookList.setBooknumbers(0);
        System.out.println("退出系统成功");
        System.exit(0);
    }
}

4.6 Classe FindOperate

A classe FindOperate implementa a interface IOperation, reescreve o método word da interface IOperation, insere o título do livro a ser pesquisado, percorre a matriz do livro, imprime o livro se for encontrado e imprime o livro se não puder encontrá-lo.

package operate;
import book.BookList;
import java.util.Scanner;
public class FindOperate implements IOperation{
    
    
    @Override
    public void work(BookList bookList) {
    
    
        System.out.println("请输入你要查找的图书的名字");
        Scanner scanner = new Scanner(System.in);
        String bookName = scanner.nextLine();
        int currentNums = bookList.getBooknumbers();
        for (int i = 0; i < currentNums; i++) {
    
    
            if(bookList.getBook(i).getName().equals(bookName)) {
    
    
                System.out.println(bookList.getBook(i));
                return;
            }
        }
        System.out.println("没有你要查找的图书");
    }
}

4.7 Classe ReturnOperate

A classe ReturnOperate implementa a interface IOperation, reescreve o método word da interface IOperation, insere o título do livro a ser retornado, percorre a matriz do livro e encontra o livro a ser devolvido. Se o atributo de empréstimo do livro for true, altere o atributo de empréstimo do livro para false e o retorno será bem-sucedido. Se o livro a devolver não for encontrado, o livro a devolver não pertence à biblioteca e não necessita de ser devolvido.

package operate;
import book.BookList;
import java.util.Scanner;
public class ReturnOperate implements IOperation{
    
    
    @Override
    public void work(BookList bookList) {
    
    
        System.out.println("请输入你要归还的图书的名字");
        Scanner scanner = new Scanner(System.in);
        String bookName = scanner.nextLine();
        int currentNums = bookList.getBooknumbers();
        for (int i = 0; i < currentNums; i++) {
    
    
            if(bookList.getBook(i).getName().equals(bookName)) {
    
    
                if((bookList.getBook(i).getBorrow()) == false) {
    
    
                    System.out.println("图书存在,不用归还");
                }else {
    
    
                    bookList.getBook(i).setBorrow(false);
                }
                return;
            }
        }
        System.out.println("该图书不属于图书馆,不用归还");
    }
}

4.8 Classe ShowOperate

A classe ShowOperate implementa a interface IOperation, reescreve o método word da interface IOperation, percorre a matriz do livro e imprime cada livro.

package operate;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ShowOperate implements IOperation{
    
    
    @Override
    public void work(BookList bookList) {
    
    
        int currentNums = bookList.getBooknumbers();
        for (int i = 0; i < currentNums; i++) {
    
    
            Book book = bookList.getBook(i);
            System.out.println(book);
        }
    }
}

おすすめ

転載: blog.csdn.net/zhanlongsiqu/article/details/130652061