目录
在编写图书管理系统的代码之前,脑子里要有个思路和框架。
第一,要有书和书架
第二,要有管理员和普通用户用于对图书的相关操作
第三,要实现对图书的相关功能,例如对图书的增加,删除,展示,查找,退出系统的相关工作。
建立书和书架
建立书本:
在书本中定义书的相关性质,例如书的名字,作者,价格,类型等
public class book {
private String name;
private double price;
private String type;
private String author;
private boolean isBorrowed; //表示是否已经借出
public book(String name, double price, String type, String author) {
this.name = name;
this.price = price;
this.type = type;
this.author = author;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", price=" + price +
", type='" + type + '\'' +
", author='" + author + '\'' +
", 状态:" +((isBorrowed) ? "已借出":"未借出")+
'}';
}
}
建立书架
书架的建立的目的就是对书这个个体执行相关的操作,就像现实生活的书架一样。(再次强调:是对书这个个体进行操作,而不是对书的性质执行操作,对书的性质执行操作的是上面的书)。
在建立书架的时候,要想到书架的功能,就是:修改书,获取书,获取书的数目。
import Book.book; //导入book类
public class bookList { //这里的booklist只是起到一个书架的作用
private book[] books = new book[10]; //定义这个书架上存放的书
private int usedSize;
public bookList(){
books[0] = new book("三国演义",19,"小说","罗贯中");
books[1] = new book("水浒传",29,"小说","施耐庵");
books[2] = new book("西游记",39,"小说","吴承恩");
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 setBook(int pos,book book) { //这个是用于删除书的时候用的,将某个位置放入某个书
books[pos] = book;
}
}
实现功能:
设置接口:
设置接口的目的就是让多个有功能的类去实现这个接口,进行增加,删除等操作。
import Booklist.bookList;
public interface IOperation {
void work(bookList bookList);
}
增加操作:
import Book.book;
import Booklist.bookList;
import java.util.Scanner;
public class AddOperation implements IOperation{
public void work(bookList bookList) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入图书名称:");
String name = scanner.nextLine();
System.out.println("请输入价格:");
double price = scanner.nextDouble();
System.out.println("请输入类型:");
String type = scanner.next();
System.out.println("请输入作者:");
String author = scanner.next();
book book = new book(name,price,type,author); //从堆区中新开辟一片空间,存放新书
int usedSize = bookList.getUsedSize(); //获取原来书的数目
bookList.setBook(usedSize,book); //将书放在最后一个位置,这个书的数目就表示新开辟的书的下标(因为下标是从零开始的)
bookList.setUsedSize(++usedSize);
System.out.println("添加图书成功!");
}
}
增加操作的详细解析:
现在的目的是要在书架上新增一本书,将这本书放在现存书的最后一个位置,在Java中,新增东西要去开辟空间,所以这里用到new ,去新开辟一个空间存放书就是代码:
book book = new book(name,price,type,author);
新书有了之后,要将这本书放在书架上,也就是放在最后一本的位置,因为这个书架booklist中的书book是数组的形式存储的,所以书本的数目就可以当作为这本新书的下标(数组的下标是从0开始的)
所以:表示在usdsize位置放一本数。
bookList.setBook(usedSize,book);
放完之后再将书的数目加1即可。
删除操作:
import Booklist.bookList;
import Book.book;
public class DelOperation implements IOperation{
public void work(bookList bookList) {
System.out.println("请输入要删除的书名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
int index = 0;
int i = 0;
for(i=0;i<bookList.getUsedSize();i++){
book book = bookList.getBook(i); //从书架中找到这个本书
if(name.equals(book.getName())){ //再从刚在找到的书中获取刚才书的名字,判断与要删除的书是否相同
index = i; //如果相同返回这个书的下标
break;
}
}
if(i>=bookList.getUsedSize()) { //如果遍历了这个书架的所有书有没找到,表示没有这个书
System.out.println("找不到这本书");
return;
}
int j = 0;
for (j = index;j< bookList.getUsedSize()-1;j++){
book book = bookList.getBook(j+1); //获取下一本书
bookList.setBook(j,book); //将下一本书覆盖在前一本书的位置上
}
bookList.setBook(bookList.getUsedSize()-1, null);
bookList.setUsedSize(bookList.getUsedSize()-1); //书的总长度-1(因为删除了)
System.out.println("删除成功!");
}
}
删除操作详细解析:
想要删除一本书,首先要从书架中找到这本书,执行的操作为:把每一本书拿出来,与自己想要的数进行比对,看是不是自己要的那本书。
把书拿出来:
book book = bookList.getBook(i);
每本进行比对,找到则返回下标:
for(i=0;i<bookList.getUsedSize();i++){
book book = bookList.getBook(i);
if(name.equals(book.getName())){
index = i;
break;
}
}
删除核心:将后面一本书覆盖在前面一本书上
book book = bookList.getBook(j+1);
查找操作:
这个操作简单相信大家都会。
for(int i=0;i<bookList.getUsedSize();i++){
book book = bookList.getBook(i);
if(name.equals(book.getName())){
System.out.println(book);
return;
}
}
展示操作:
操作简单,相信大家都会。
int usedSize = bookList.getUsedSize(); //得到书的长度
for (int i=0;i<usedSize;i++){
book book = bookList.getBook(i);
System.out.println(book);
设置用户操作
创建“主”用户:
设置用户,用来“存储”(被继承)两个身份的用户,一个是普通用户,另一个是普通用户。
import Booklist.bookList;
public abstract class User {
protected String name;
protected IOperation[] iOperations;
public abstract int menu();
public void doWork(int choice, bookList bookList){
iOperations[choice].work(bookList);
}
public User(String name) {
this.name = name;
}
}
再这个类中创建接口数组,让其子类实现相应功能的跳转,当这个抽象类被继承的时候,子类为普通类,要重写这个类的方法。
管理员操作:
import java.util.Scanner;
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DisplayOperation(),
new DelOperation()
};
}
@Override
public int menu(){
System.out.println("===========管理员菜单============");
System.out.println("您好, 管理员 "+this.name+":");
System.out.println("欢迎来到图书馆!");
System.out.println("1. 查找图书");
System.out.println("2. 新增图书");
System.out.println("3. 显示图书");
System.out.println("4. 删除图书");
System.out.println("0. 退出系统");
System.out.println("=================================");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
因为父类中有设置接口数组,那么这个子类中也有这个接口数组,在子类中将需要的功能实例化,在数组中。(实例化之后,这个功能类才能正常使用),至于这个是如何跳转的,在下面的主函数中详细介绍。
主函数:
import Booklist.bookList;
import Users.AdminUser;
import Users.NormalUser;
import Users.User;
import java.util.Scanner;
public class Main {
public static User work(){
System.out.println("请输入您的姓名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("请输入身份: 1-> 管理员登录 0-> 用户登录");
int choice = scanner.nextInt();
if(choice==1){
return new AdminUser(name);
}
return new NormalUser(name);
}
public static void main(String[] args) {
bookList bookList = new bookList();
User user = work();
while (true) {
int choice = user.menu(); //
user.doWork(choice, bookList);
}
}
}
主函数详细解析:
首先要判断是什么身份,这个操作用到了向上转型,那为什么要用到向上转型呢?答案很简单,就是为了实现动态绑定,根据choice值的不同,去调用不同的子类,这边 User user = work();的目的就是为了实现向上转型,实例化子类,user.menu() ,根据new的对象,调用相关子类的菜单,根据子类返回值chioce,相关功能的实现用user.doWork(choice, bookList)跳转。
以上图书管理系统大致思路就是我的个人的相关见解,肯定有不足的地方,如果发现错误,欢迎评论区留言。