Diretório de artigos
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);
}
}
}