这个图书管理系统主要是分为两个功能根据输入的用户姓名来进行管理员以及普通用户的区分如下所示然后根据所选择的角色进行不同权限菜单的访问对于管理员对于普通用户:接下来进行用户的操作选择。1.寻找对象bookBOOK、BookListUser:AdmainUser、NormalUser2.主要实现2.1创建对象2.1.1书对于书在这里我们要将书籍这个类进行定义包括每一个变量注意这里要对于每一个书籍的权限一定要限制起来不能 全部都是public要注意隐私性、构造方法、以及Getter and Setter方法这里通过Getter and Setter来进行变量的访问public class Book { private String name; private String author; private int price; private String type; private boolean isBorrowed; public Book(String name, String author, int price, String type) { this.name name; this.author author; this.price price; this.type type; } //在进行构造方法的时候不能进行构造isBorrowed因为这个变量不是根据我们输入的时候决定的本身默认false未借出 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 isBorrowed() { return isBorrowed; } public void setBorrowed(boolean borrowed) { this.isBorrowed borrowed; } Override public String toString() { return Book{ name name \ , author author \ , price price , type type \ (isBorrowed? 已借出: 未借出) }; } }2.1.2书架书架这里 直接将上面的书放入到一个顺序表当中进行数据结构的封装注意这里private Book books[]new Book[10];对于books我们将Book数据类型对应的对象作为数组成员放入到booksp[]当中package Library.book; public class BookList { private Book books[]new Book[10]; //不可以在这里进行成员初始化操作 private int uesdSize;//有效的数据个数 public BookList() { this.books[0] new Book(三国演义,罗贯中,19,小说); this.books[1] new Book(西游记,吴承恩,28,小说); this.books[2] new Book(红楼梦,曹雪芹,22,小说);//这些都是默认值 this.books[3] new Book(偷偷藏不住,孙,221,小说);//这些都是默认值 this.books[4] new Book(你的我的,崇,22,小说);//这些都是默认值 this.books[5] new Book(他的,苗,22,小说);//这些都是默认值 this.uesdSize6; } public Book[] getBooks() { return books; } public Book getBook(int pos) { return books[pos]; } public void setBooks(int pos,Book books) { this.books[pos] books; this.uesdSize; } public void setBook(int pos,Book books) { this.books[pos] books; } public void delBook(int pos){ for (int i pos; i this.uesdSize-1; i) { books[i]books[i1]; } this.uesdSize--; } public int getUesdSize() { return uesdSize; } public void setUesdSize(int uesdSize) { this.uesdSize uesdSize; } }2.1.3用户用户User是一个大类可以将普通用户和管理员进行抽取共性抽取为抽象类抽象类的抽象方法当中方法无实体只有返回值、方法名、参数列表public abstract class User { protected String name; protected Ioperation[] operations; public User(String name) { this.name name; } public abstract int menu();//抽象类当中必须要明确权限只有接口当中才是省略的public abstract public void doOperations(int choice, BookList booklist){ this.operations[choice].work(booklist); }这里有一个小点需要注意对于行为protected Ioperation[] operations; public void doOperations(int choice, BookList booklist){ this.operations[choice].work(booklist); }对于用户public abstract int menu();//抽象类当中必须要明确权限只有接口当中才是省略的public abstract2.1.3.1管理员管理员里面要有自己的菜单public class AdmainUser extends User{ public AdmainUser(String name) { super(name); this.operationsnew Ioperation[]{ new ExitOperation(), new FindOperation(), new AddOperation(), new DelOperation(), new ShowOperation() }; } public int menu(){ System.out.println(********this.name管理员用户菜单****** ); System.out.println( 0. 退出系统 ); System.out.println( 1. 查找图书 ); System.out.println( 2. 新增图书 ); System.out.println( 3. 删除图书 ); System.out.println( 4. 显示图书 ); System.out.println(************************** ); System.out.println(请输入你的操作); Scanner scnew Scanner(System.in); int choicesc.nextInt(); return choice; } }2.1.3.2普通用户public class NormalUser extends User{ public NormalUser(String name) { super(name); this.operationsnew Ioperation[]{ new ExitOperation(), new FindOperation(), new BorrowOperation(), new ReturnOperation() }; } Override public int menu() { System.out.println(********this.name普通用户菜单****** ); System.out.println( 0. 退出系统 ); System.out.println( 1. 查找图书 ); System.out.println( 2. 借阅图书 ); System.out.println( 3. 归还图书 ); System.out.println(************************** ); System.out.println(请输入你的操作); Scanner scnew Scanner(System.in); int choicesc.nextInt(); return choice; } }2.2实现项目结构 2.2.1如何实现根据用户角色选择的不同分别调用各自的菜单列表 在主函数当中这样进行定义撰写一个登录方法public static User login(){ System.out.println(请输入你的姓名); Scanner scnew Scanner(System.in); String namesc.nextLine(); System.out.println(请输入你的身份1:管理员?2普通用户); int choicesc.nextInt(); if(choice1){ User admainnew AdmainUser(name); return admain; }else{ return new NormalUser(name); } }在psvm当中的调用public static void main(String[] args) { BookList bookListnew BookList();//实例化一个对象 User userlogin(); while(true) { int choice user.menu(); //要根据这个返回值来看调用了哪个对象的哪个方法 //1.哪个对象 // 已经进行了User userlogin(); // 2.哪个方法 // 就是user.doOperations(choice,bookList); user.doOperations(choice, bookList); } }其中对于这里我们首先要初始化一个书架对象BookList bookListnew BookList();直接调用User userlogin();这里有一个知识点就是运用了多态的思想向上转型因为User admainnew AdmainUser(name); return admain; }else{ return new NormalUser(name);他的返回值类型不统一一个是AdmainUser一个是NormalUser,只能通过他们的父类User进行接收所以对于login()方法他的返回值是User 。所以之后通过 user.menu();就可以实现了2.2.2如何实现根据用户选择的选项进行不同操作之间的调用首先观察这个操作对于用户还是管理员之间是有重叠部分的显然是有的但是为了避免方法的重复性我们可以将方法每一个分别包装在自己的类当中但是为了组织这些操作方法类我们该怎样进行组织呢通过接口接口是一个规范只要每一个操作方法类都遵循这一个规范就可以可以通过这一个接口来实现操作方法类的向上转型进而实现多态才能得到虽然是一个方法名但是是实现了不同的方法操作所以定义一个接口public interface Ioperation { void work(BookList booklist); }每一个操作方法类实现这一个方法work对于每一个不同用户操作的构成是不一样的那我们是怎样进行保证在User当中定义一个操作数组里面的每一个项都是一个操作方法实例对象 但是类型是接口的因为这些操作方法都实现了这个接口。protected Ioperation[] operations;然后对于不同的用户中分别进行定义定义的时候一定是在各自类的构造函数当中进行定义当实例化一个用户对象的时候就会调用管理员public AdmainUser(String name) { super(name); this.operationsnew Ioperation[]{ new ExitOperation(), new FindOperation(), new AddOperation(), new DelOperation(), new ShowOperation() }; }普通用户public NormalUser(String name) { super(name); this.operationsnew Ioperation[]{ new ExitOperation(), new FindOperation(), new BorrowOperation(), new ReturnOperation() }; }接下来在主方法当中接受菜单传来的选择int choice user.menu();最后是通过在User这里面定义一个方法来进行操作public void doOperations(int choice, BookList booklist){ this.operations[choice].work(booklist); }在Main当中进行调用user.doOperations(choice, bookList);以上是总流程~2.3部分代码AddOperationpackage Library.ioperation; import Library.book.Book; import Library.book.BookList; import java.util.Scanner; public class AddOperation implements Ioperation{ //判断书架是否是满的:在书架满的情况下就不能增加书籍了 Override public void work(BookList booklist) { int currentSizebooklist.getUesdSize(); if(currentSizebooklist.getBooks().length){ System.out.println(书架满了不能放书了); return; } System.out.println(实现了增加图书操作); System.out.println(请输入书籍的名称); Scanner scnew Scanner(System.in); String namesc.nextLine(); System.out.println(请输入书籍的作者); String authorsc.nextLine(); System.out.println(请输入书籍的价格); int pricesc.nextInt(); sc.nextLine(); System.out.println(请输入书籍的类型); String typesc.nextLine(); //实例化书籍 Book booknew Book(name,author,price,type); // 查看这个书架是否有这本书 for (int i 0; i currentSize; i) { Book bookibooklist.getBook(i); if(booki.getName().equals(name)){ System.out.println(存在这本书); return; } } //增加书籍 booklist.setBooks(currentSize,book); System.out.println(增加了书籍book); } }注意点就是其中查看这个书 的名字一定要用getName这个方法进行获取// 查看这个书架是否有这本书 for (int i 0; i currentSize; i) { Book bookibooklist.getBook(i); if(booki.getName().equals(name)){ System.out.println(存在这本书); return; } }2.4后续改进每次运行程序 上次运行的结果就没有了所以想存储数据1换成文件存储在文件当中2换成MySQL存储在数据库当中