在建立一个图书管理系统的时候我们首先需要构造一个书类
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
@Override
public 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)
打印出每本书的详细信息