在建立一个图书管理系统的时候我们首先需要构造一个书类
public class Book {private String name;private String author;private int price;private String type;private boolean isBorrwed;public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}//构造方法
因为类成员是 private修饰的所以我们要用到set和get构造器来访问它们
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 isBorrwed() {return isBorrwed;}public void setBorrwed(boolean borrwed) {isBorrwed = borrwed;}//用于获取图书和设置图书
打印一下 用tosring
@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((isBorrwed==true)?"已经借出":"未被借出")+'}';}
}//它将生成并返回一个格式化的字符串,拿来打印的
第二步我们需要建立一个书架,这个书架的作用是拿取书 增加书,借阅书等操作都将在这里完成
所以我们建立一个新的类
package book;public class Booklist {private Book[] books;private int usedsize;private static final int DEA=10;public Booklist(){this.books=new Book[DEA];//放书this.books[0]=new Book("三国演义","罗贯中",10,"小说");this.books[1]=new Book("红楼梦","曹雪芹",19,"小说");this.books[2]=new Book("西游记","吴承恩",22,"小说");this.usedsize=3;}public int getUsedsize() {return usedsize;}public void setUsedsize(int usedsize) {this.usedsize = usedsize;}public Book getBook(int pos){return books[pos];}public void setBooks(int pos,Book book){books[pos]=book;}public Book[] getBooks(){return books;
}}
因为要放多本书,所以我们的类成员需要是数组
同样的下列方法
构造函数:
public Booklist() 初始化一个Booklist对象时,创建一个大小为DEA的Book数组,并填充了三本预设的书籍信息,同时设置了usedsize为3,表示已有3本书被使用
-
getter 和 setter 方法:
getUsedsize()
返回当前使用的书籍数量。setUsedsize(int usedsize)
设置当前使用的书籍数量。getBook(int pos)
返回索引为pos
位置处的Book
对象。setBooks(int pos, Book book)
将新的Book
对象替换到索引为pos
的位置上。getBooks()
返回整个书籍数组,包含了所有存储的Book
对象。
第三步我们回到main函数来布置主要的逻辑
可以看到我们有两个界面一个是管理员界面一个是普通用户界面。首先我们需要完善它们的菜单
然后根据我们的选择进入哪个菜单
先完成主函数设置
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 Adimer(name);}else {return new NormalUser(name);}}
然后我们来设置管理员系统和普通用户系统,在设置它们两之前 我们要先弄一个总的用户系统
这个系统不需要实例化只需要被继承所以他应该是抽象类
package user;import book.Booklist;
import oper.IOperation;public abstract class User {protected String name;protected IOperation[] ioperations;public User(String name) {this.name = name;}public abstract int menu();public void doOpenration(int choice, Booklist booklist){ioperations[choice].work(booklist);}
}
package oper;import book.Booklist;public interface IOperation {void work(Booklist booklist);
}
在实现这个类之前 我们需要构建一个接口
这个接口的设计意图是为了规定一种规范,任何实现了 IOperation
接口的类都需要提供一个执行具体工作的 work
方法,这个方法接受一个 Booklist
对象作为参数。
-
成员变量:
name
:保护类型(protected)的字符串变量,用于存储用户的姓名。ioperations
:保护类型(protected)的IOperation
接口数组,其中每个元素都是一个实现了IOperation
接口的对象。这些对象代表用户可以执行的各种操作,如查找图书、添加图书、删除图书等。
-
构造函数:
public User(String name)
:接收一个字符串参数name
,用于初始化用户的名字。
-
抽象方法:
public abstract int menu()
:这是一个抽象方法,要求子类必须实现。这个方法通常用来展示一个操作菜单并获取用户选择的操作编号。
-
具体方法:
public void doOpenration(int choice, Booklist booklist)
:根据传入的choice
参数调用ioperations
数组中对应索引位置的操作对象的work()
方法,并将一个Booklist
对象作为参数传递给该方法。Booklist
类似于一个图书列表,包含了图书的相关信息。
现在来设置用户系统和管理员系统
用户系统
package user;import oper.*;import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);//帮助父类构造this.ioperations=new IOperation[]{new Exitoperation(),new Findpritation(),new borropertation(),new returnpertation()};}public int menu(){System.out.println("*********************");System.out.println("****1.查找图书*********");System.out.println("****2.借阅图书*********");System.out.println("****3.归还图书*********");System.out.println("****0.退出************");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的操作");int choie=scanner.nextInt();return choie;}
}
-
类定义:
public class NormalUser extends User
表示NormalUser
类继承自User
类,可以获得父类的所有属性和方法。 -
构造函数:
public NormalUser(String name)
接收一个字符串参数name
,并在构造函数中调用父类的构造函数super(name)
以初始化用户名字。同时,它创建了一个IOperation
类型的数组,包含四个操作实现类对象:Exitoperation
(退出操作)、Findpritation
(查找图书操作)、borropertation
(借阅图书操作)和returnpertation
(归还图书操作)。这些操作是普通用户在图书管理系统中可以执行的动作。 -
menu()
方法:重写了父类的抽象方法menu()
,在此方法中打印出针对普通用户的操作菜单,并通过Scanner
从控制台读取用户的选择。根据用户输入的数字,返回相应的操作编号。
管理员系统
package user;import oper.*;import java.util.Scanner;public class Adimer extends User{public Adimer(String name) {super(name);this.ioperations=new IOperation[]{new Exitoperation(),new Findpritation(),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.退出系统*********");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的操作");int choie=scanner.nextInt();return choie;}}
-
类定义:
public class Adimer extends User
表示Adimer
类继承自User
类,可以获得父类的所有属性和方法。 -
构造函数:
public Adimer(String name)
接收一个字符串参数name
,并在构造函数中调用父类的构造函数super(name)
以初始化用户名字。同时,它创建了一个IOperation
类型的数组,包含五个操作实现类对象:Exitoperation
(退出操作)、Findpritation
(查找图书操作)、Addoperation
(新增图书操作)、Deloperation
(删除图书操作)和Showoperation
(显示图书操作)。这些操作是管理员用户在图书管理系统中可以执行的动作,相比普通用户,管理员拥有更多的权限,例如新增和删除图书。 -
menu()
方法:重写了父类的抽象方法menu()
,在此方法中打印出针对管理员用户的操作菜单,并通过Scanner
从控制台读取用户的选择。根据用户输入的数字,返回相应的操作编号。
现在我们来构造功能
增加图书
ackage oper;import book.Book;
import book.Booklist;import java.util.Scanner;public class Addoperation implements IOperation{public void work(Booklist booklist) {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("请输入类型");String type=scanner.nextLine();System.out.println("请输入价格");int price=scanner.nextInt();Book book=new Book(name,author,price,type);//检查 数组当中有没有这本书int currentsize= booklist.getUsedsize();for (int i = 0; i <currentsize; i++) {Book book1=booklist.getBook(i);if (book1.getName().equals(name)){System.out.println("有这本书,不进行存放");return;}}if(currentsize== booklist.getBooks().length){System.out.println("书架满了");}else {booklist.setBooks(currentsize,book);booklist.setUsedsize(currentsize+1);}}
}
-
类定义:
public class Addoperation implements IOperation
表示Addoperation
类实现了IOperation
接口,需要实现接口中定义的work()
方法。 -
work(Booklist booklist)
方法:- 打印提示信息,让用户输入新书的信息(书名、作者、类型、价格)。
- 使用
Scanner
从控制台读取用户输入。 - 根据用户输入创建一个新的
Book
对象。 - 检查
Booklist
中是否存在同名的书籍。通过遍历booklist
中已有的图书,比较书名是否相同。 - 如果存在同名书籍,则打印提示信息并结束本次新增操作。
- 如果
Booklist
已满(即已存图书的数量等于booklist
数组的容量),则打印提示信息。 - 若以上条件均不满足,则将新书添加到
Booklist
中,通过调用booklist.setBooks(currentsize, book)
将新书放置在数组的下一个可用位置,并通过调用booklist.setUsedsize(currentsize + 1)
更新已使用书籍的数量。
借阅图书
package oper;import book.Book;
import book.Booklist;import java.util.Scanner;public class borropertation implements IOperation{public void work(Booklist booklist) {Scanner scanner=new Scanner(System.in);System.out.println("借阅图书");String name=scanner.nextLine();int currensize=booklist.getUsedsize();for (int i = 0; i <currensize; i++) {Book book=booklist.getBook(i);if (book.getName().equals(name)){book.setBorrwed(true);System.out.println("借阅成功");System.out.println(book);return;}}System.out.println("你借阅的图书不存在");}
}
与增加图书的接口一样
work(Booklist booklist) 方法:
使用 Scanner 从控制台读取用户输入的想要借阅的图书的书名。
获取图书列表 booklist 中当前已存图书的数量(currensize)。
遍历图书列表中的所有图书(通过 booklist.getBook(i) 获取每一本书),比较每本书的书名是否与用户输入的书名相同。
如果找到匹配的书名,则将该书的借阅状态设为 true(通过调用 book.setBorrwed(true)),输出借阅成功的消息,并打印出借阅后的图书详细信息。
若遍历完整个图书列表都没有找到与用户输入相符的书名,则输出提示信息:“你借阅的图书不存在”。
删除图书
package oper;import book.Book;
import book.Booklist;import java.util.Scanner;public class Deloperation implements IOperation{public void work(Booklist booklist) {System.out.println("删除图书");Scanner scanner=new Scanner(System.in);System.out.println("请输入你要删除的图书");String name=scanner.nextLine();int pos=-1;int i=0;int currensize= booklist.getUsedsize();for ( i = 0; i <currensize; i++) {Book book=booklist.getBook(i);if (book.getName().equals(name)){pos=i;break;}}if (i==currensize){System.out.println("没有你要删除的图书");return;}//开始删除int j=pos;for ( j = pos; j < currensize-1; j++) {//Book book=booklist.getBook(j+1);booklist.setBooks(j,book);}booklist.setBooks(j,null);booklist.setUsedsize(currensize-1);}
}
work(Booklist booklist)
方法:
- 打印提示信息,让用户输入要删除的图书的书名。
- 使用
Scanner
从控制台读取用户输入的书名。 - 遍历图书列表
booklist
中的所有图书,寻找与用户输入相匹配的书名。 - 如果找到了匹配的书名,记录下该书在列表中的位置(
pos
)并跳出循环。 - 如果遍历完列表仍未找到匹配书名,则输出提示信息“没有你要删除的图书”,并直接返回。
- 如果找到了匹配的书名,开始执行删除操作:从找到的书所在位置 (
pos
) 开始,将后面的所有图书向前移动一位,覆盖掉待删除图书的位置,相当于删除了该书。 - 最后,将列表末尾的元素设为
null
,并减少已使用图书的数量(通过调用booklist.setUsedsize(currensize - 1)
)
退出系统
这里比较简单用个方法就好
package oper;import book.Booklist;public class Exitoperation implements IOperation{public void work(Booklist booklist) {System.out.println("退出图书");System.exit(0);}
}
查找图书
package oper;import book.Book;
import book.Booklist;import java.util.Scanner;public class Findpritation implements IOperation{public void work(Booklist booklist) {System.out.println("找到图书");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int currentsize= booklist.getUsedsize();for (int i=0;i<currentsize;i++){Book book=booklist.getBook(i);if (book.getName().equals(name)){System.out.println("找到了这本书;信息如下");System.out.println(book);return;}}System.out.println("没有找到");}
}
work(Booklist booklist)
方法:
- 打印提示信息,提示用户输入要查找的图书名称。
- 使用
Scanner
从控制台读取用户输入的书名。 - 获取图书列表
booklist
中当前已存图书的数量(currentsize
)。 - 遍历图书列表中的所有图书,通过调用
booklist.getBook(i)
获取每一本书,并判断每本书的书名是否与用户输入的书名相同。 - 如果找到匹配的书名,则打印出找到的图书的信息,并通过
System.out.println(book)
输出图书详情,然后结束查找操作。 - 若遍历完整个图书列表都没有找到与用户输入相符的书名,则输出提示信息:“没有找到”
归还图书
和借阅图书一样改一下bool的状态打印一下结果就好
package oper;import book.Book;
import book.Booklist;import java.util.Scanner;public class returnpertation implements IOperation{public void work(Booklist booklist) {Scanner scanner=new Scanner(System.in);System.out.println("归还图书");String name=scanner.nextLine();int currensize=booklist.getUsedsize();for (int i = 0; i <currensize; i++) {Book book=booklist.getBook(i);if (book.getName().equals(name)){book.setBorrwed(false);System.out.println("归还成功");System.out.println(book);return;}}System.out.println("你归还的图书不存在");}
}
显示图书
package oper;import book.Book;
import book.Booklist;public class Showoperation implements IOperation{public void work(Booklist booklist) {System.out.println("打印图书");int curernsize=booklist.getUsedsize();for (int i = 0; i <curernsize; i++) {Book book=booklist.getBook(i);System.out.println(book);}}}
- 打印提示信息,提示正在打印图书列表。
- 获取图书列表
booklist
中当前已存图书的数量(curernsize
)。 - 遍历图书列表,通过调用
booklist.getBook(i)
获取每一本书,并使用System.out.println(book)
打印出每本书的详细信息