2.1 opperation包下的类
因为每一个操作都需要访问书架BookList所以我们留一个IOperation的接口里面留一个
work(BookList bookList);方法让下面的操作访问书架
2.1.1 AddOperation(添加操作)
这里新增图书并放在书架的顶部位置
getUsedSize在BookList类中得到书的本数并在对应的位置放上添加的数再让书的本书+1
public class AddOperation implements IOperation{ @Override 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 auther=scanner.nextLine(); System.out.println("请输入书籍的价格》"); int price=scanner.nextInt(); System.out.println("请输入书籍的类型》"); scanner.nextLine(); String type=scanner.nextLine(); Book book=new Book(name,auther,price,type); bookList.setBooks(bookList.getUsedSize(),book); System.out.println("添加成功!"); bookList.setUsedSize(bookList.getUsedSize()+1); } }
2.1.2 DeltOperation(删除操作)
遍历寻找要找的书籍并把每一个书籍向前移动,到了链表就可以更加快捷
需要注意的是名字的比较要用equals方法 A.equals(B)如果使用A==B比较的是它们对应的地址
public class DeltOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("删除图书"); System.out.println("请输入你想要删除书籍的名称》"); Scanner scanner=new Scanner(System.in); String name=scanner.nextLine(); int size=bookList.getUsedSize(); boolean key=false; for (int i = 0; i < size-1; i++) { if (bookList.getBooks(i).getName().equals(name)||key==true) { Book book=bookList.getBooks(i+1); bookList.setBooks(i,book); } } bookList.setUsedSize(bookList.getUsedSize()-1); System.out.println("删除成功!"); } }
2.1.3 DisPlayOperation(书籍展示)
这里的就用到了Book类中对Objecrt的toString方法重写
这里肯定会有人疑问为什么不直接用Systeam.out.println(books[i])来输出书籍的信息呢?
这里的books是private修饰的我们做了封装处理,
public class DisPlayOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("显示图书"); int size=bookList.getUsedSize(); for (int i = 0; i < size; i++) { System.out.println(bookList.getBooks(i)); } } }
2.1.4 FindOperation(查找操作)
这里的寻找对应名字也要用equals方法
public class FindOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("查找图书"); System.out.println("请输入想要查找的图书》"); Scanner scanner=new Scanner(System.in); String name=scanner.nextLine(); int size= bookList.getUsedSize(); for (int i = 0; i < size; i++) { if (bookList.getBooks(i).getName().equals(name)) { System.out.println(bookList.getBooks(i)); return; } } System.out.println("未找到你想要寻找的书"); } }
2.1.5 BorrowOperation(借阅操作)
这里遍历一遍再将对应位置的借阅情况更改下就好了
public class BorrowOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("借阅图书"); System.out.println("请输入你要借阅书籍的名称》"); Scanner scanner=new Scanner(System.in); String name=scanner.nextLine(); int size=bookList.getUsedSize(); for (int i = 0; i < size; i++) { if(bookList.getBooks(i).getName().equals(name)) { bookList.getBooks(i).setBorrowed(true); System.out.println("借阅成功!"); return; } } System.out.println("未找到相关书籍!"); } }
2.1.6 ReturnOperation (归还操作)
public class ReturnOperaion implements IOperation{ @Override public void work(BookList bookList) { System.out.println("归还图书"); System.out.println("请输入你要归还图书的名称》"); Scanner scanner=new Scanner(System.in); String name= scanner.nextLine(); for (int i = 0; i < bookList.getUsedSize(); i++) { if(bookList.getBooks(i).getName().equals(name)) { bookList.getBooks(i).setBorrowed(true); System.out.println("归还成功!期待下次借阅!"); return; } } System.out.println("未找到此书籍!归还失败!请到前台咨询此服务!"); } }
2.1.7 ReturnOperation (退出系统)
public class ExitOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("退出程序"); exit(1); } }
users包的操作实现用户和管理者的界面与操作逻辑
3.1.1 User类
这个类是用户和管理者的父类需要被继承,这样设计的一方面原因是面向对象语言的特点,还有一方面是这样实现可以简略代码的重复便于理解
这个类中我们要定义name来存放用户和管理者的名字,menu菜单功能在这个里面不需要实现就使用抽象类abstract修饰再对应的子类实现对应的菜单,操作需要按照菜单进行操作所以我们需要一个IOperation这个类的操作数组有人会异或为什么是IOpernation类型呢?这只是一个接口为什么要用它,这里其实发生了向上转型,这个数组将存放各种书架操作,而这些操作是需要IOpernation接口,全部展开就是IOpernation iOpernation=new AddOpernation......这些操作,可以理解成父类继承的向上转型然后再运行时发生动态绑定将对应的menu方法和操作方法替换
里面写一个doOperation实现功能方法
this.iOperations[choice].work(bookList)里this就是本类的iOpernations操作数组的第choice个操作对应的work实现方法。
public abstract class User { protected String name; protected IOperation[] iOperations; public User(String name) { this.name = name; } public abstract int menu(); public void doOperation(int choice, BookList bookList) { this.iOperations[choice].work(bookList); } }
3.1.2 AdminUser管理员
重写对应的menu和对应的操作数组
public class AdminUser extends User{ public AdminUser(String name) { super(name); this.iOperations=new IOperation[] { new ExitOperation(), new DisPlayOperation(), new FindOperation(), new AddOperation(), new DeltOperation() }; } @Override public int menu() { System.out.println("hello "+name); 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; } }
3.1.3 NormalUser用户
也是重写对应的menu以及操作方法数组
public class NormalUser extends User{ public NormalUser(String name) { super(name); this.iOperations=new IOperation[] { new ExitOperation(), new DisPlayOperation(), new FindOperation(), new BorrowOperation(), new ReturnOperaion() }; } @Override public int menu() { System.out.println("hello "+name); 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; } }
下面是实现这些所有功能的类
这里我们需要先写一个login里面写登录的基本语言以及选择管理员登录还是用户登录
public static User login() { System.out.println("欢迎来到图书系统!"); System.out.println("请输入你的昵称》"); Scanner scanner=new Scanner(System.in); String name=scanner.nextLine(); System.out.println("1.用户登录 2.管理员登录"); int user=scanner.nextInt(); if(user==1){ return new NormalUser(name); }else { return new AdminUser(name); } }
再使用main来串联起这些所有功能,使对应的用户功能实现在对应的内部实现
编辑
以上就是图书管理系统的内容了,完整代码放在22_5_18_book/src · 404NOt/Java - 码云 - 开源中国 (gitee.com)
我的总结可能不是十分到位,也可能会有专业上的疏忽欢迎在评论区留言!