以下为想要实现的功能:
1,Book:
首先建立Book这个类,里面包含书的详细信息,包括书名,作者,价格,类型,是否借出(用bool类型,因为只有借出和未借出两种状态),需要封装起来,均用private修饰,防止被其他类访问到。
生成书的构造方法;只需要写书名,作者,价格,类型即可,因为每创立一本书都默认为未借阅的。
打印书的信息,需要重写toString方法(可借助编译器生成),编译器自动生成的islend打印的内容为true或者false。我们可以将其改为“已借阅”和“未借阅”字样。-》 (isLend?"已借阅":"未借阅")
我们还需要让编译器自动生成get和set方法,因为成员变量只能在类中使用,所以我们需要可以在类外访问到成员变量的方法。
public class Book { private String name; private String author; private int price; private String type; private boolean isLend; public Book(String name, String author, int price, String type) { this.name = name; this.author = author; this.price = price; this.type = type; } 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 isLend() { return isLend; } public void setLend(boolean lend) { isLend = lend; } @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", author='" + author + '\'' + ", price=" + price + ", type='" + type + '\'' + ", isLend=" + (isLend?"已借阅":"未借阅") + '}'; } }
2,BookList
要存放所有的书,所以在这个类里面建立一个内容为书这个类的数组,并定义一个int类型的变量useSize来记录这个数组里面已经放了多少本书了。
因为useSize被封装起来,所以也要写方法来获取和设置这个值。
public class BookList { Book[] books=new Book[10]; private int useSize; public BookList(){ books[0]=new Book("三国演义","罗贯中",10,"小说"); books[1]=new Book("西游记","吴承恩",12,"小说"); books[2]=new Book("红楼梦","曹雪芹",11,"小说"); this.useSize=3; } public int getUseSize() { return useSize; } public void setUseSize(int useSize) { this.useSize = useSize; } }
3,用户
用户分为两种,一种为普通用户,另一种为管理者,这两个类里面有一些相同的成员变量以及方法,所以我们可以写一个User父类,让两个类继承与这个父类,这个样可以减少代码的重复。又因为这个父类是为了被继承,不会描述具体的对象,所以这个父类为一个抽象类。
public abstract class User { private String name; public User(String name) { this.name = name; } }
public class NormalUser extends User { public NormalUser(String name) { super(name); } }
public class Administrator extends User{ public Administrator(String name) { super(name); } }
4,Main
主函数里,建立目录目录方法。里面包括输入使用者的姓名和选择身份。如果选择的为1,则返回一个实例化的Administrator,如果选择的为2.则返回一个实例化的NormalUser,之后用User user接收,实现向上转型。
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 Administrator(name); }else { return new NormalUser(name); } } public static void main(String[] args) { User user=login(); }
这时实例化好了用户(普通用户或者管理者)。这是需要打印出他们分别对应的目录,以及选择目录中不同功能的选项。由于要打印好实例化用户的对象,所以要在Administrator和NormalUser类中分别描述目录内容。因为刚刚在实例化对象时发生向上转型,而向上转型只能访问父类下方的方法,所以要先在父类里写一个抽象方法 menu();而子类重写这个方法,用来打印目录和做出会功能的选择。
在User中增加:
public abstract int menu();
在Administrator中增加:
@Override 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,退出系统"); System.out.println("**************************"); System.out.println("请输入你操作"); Scanner scanner=new Scanner(System.in); int choice=scanner.nextInt(); return choice; }
在NormalUser中增加:
@Override public int menu() { System.out.println("********普通用户菜单*********"); System.out.println("1,查找图书"); System.out.println("2,借阅图书"); System.out.println("3,归还图书"); System.out.println("0,退出系统"); System.out.println("**************************"); System.out.println("请输入你操作"); Scanner scanner=new Scanner(System.in); int choice=scanner.nextInt(); return choice; }
这时Main类通过父类的引用来调用 menu方法,发生动态绑定,从而执行对应子类的 menu方法,并返回在子类方法中选择的操作序号。
我们可以将多个操作作为一个整体,成为一个接口,这样方便后续的使用。首先,创立一个接口,接口里有一个work的方法,由于各个操作都需要用到BookList这个类,所以将BookList作为work方法的参数。然后分别将增加图书,借阅图书……建为一个类,并引用这个接口。
public interface IOperation { void work(BookList bookList); }
public class AddBook implements IOperation { @Override public void work(BookList bookList) { System.out.println("增加图书"); } }
public class BorrowBook implements IOperation{ @Override public void work(BookList bookList) { System.out.println("借阅图书"); } }
public class DelBook implements IOperation{ @Override public void work(BookList bookList) { System.out.println("删除图书"); } }
public class ExitSystem implements IOperation{ @Override public void work(BookList bookList) { System.out.println("退出系统"); } }
public class FindBook implements IOperation{ @Override public void work(BookList bookList) { System.out.println("查找图书"); } }
public class ReturnBook implements IOperation{ @Override public void work(BookList bookList) { System.out.println("归还图书"); } }
public class ShowBook implements IOperation{ @Override public void work(BookList bookList) { System.out.println("显示图书"); } }
接口创立好后,在User类中,实例化一个接口数组,并在两个子类中对接口数组进行赋值,将属于他们各自操作的接口放入接口数组中。
User中:
IOperation[] iOperations=new IOperation[]{};
在NormalUser中:
this.iOperations=new IOperation[]{new ExitSystem(),new FindBook(), new BorrowBook(), new ReturnBook()};
在Administrator中:
this.iOperations=new IOperation[]{new ExitSystem(),new AddBook(), new DelBook(),new ShowBook()};
这样在实例化好对象,发生向上转型时,也实例化好好了这个接口数组,然后在父类User中建立一个抽象方法,用这个方法去调用接口数组中的接口。
User中:
public abstract void doOperation(int choice, BookList bookList);
在NormalUser中:
@Override public void doOperation(int choice, BookList bookList) { iOperations[choice].work(bookList); }
在Administrator中:
@Override public void doOperation(int choice, BookList bookList) { iOperations[choice].work(bookList); } }
与此同时,在主函数中,通过父类的引用调用doOperation这个方法,从而去实现具体的操作。
在Main中:
while(true){ int choice = user.menu(); user.doOperation(choice, bookList); }
此时框架已经搭建好,只需要分别完成对应操作的代码:
FindBook:寻找图书时,需要遍历books这个数组,看有没有与查找到图书名字相同的有则找到了,打印出书本的信息,反之,则没找到。
public class FindBook 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 currentSize=bookList.getUseSize(); 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; } if(book.getAuthor().equals(Name)){ System.out.println("找到了!!!"); System.out.println(book); } } System.out.println("没有该图书!!!"); } }
ShowBook:借助上述代码的for循环即可实现
public class ShowBook implements IOperation{ @Override public void work(BookList bookList) { System.out.println("显示图书"); int currentSize=bookList.getUseSize(); for (int i = 0; i <currentSize ; i++) { Book book=bookList.getBook(i); System.out.println(book); } } }
AddBook:先判断书架是否满了,如果满了,添加失败,没有满,则输入书名,此时判断书架上有无这本书,如果有不添加,如果没有,再输入作者,价格,类型等。
在BookList中增加:
public boolean isFull(){ return useSize==books.length; } public void setBook(Book book){ books[useSize]=book; }
在AddBook中:
public class AddBook implements IOperation { @Override public void work(BookList bookList) { System.out.println("增加图书"); if (bookList.isFull()==true){ System.out.println("书架满了,添加失败"); return; } System.out.println("输入要增加的书名"); Scanner scanner=new Scanner(System.in); String Name=scanner.nextLine(); int currentSize=bookList.getUseSize(); 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("输入书的作者"); String author=scanner.nextLine(); System.out.println("输入书的价格"); int price=scanner.nextInt(); scanner.nextLine(); System.out.println("输入书的类型"); String type=scanner.nextLine(); Book book=new Book(Name,author,price,type); bookList.setBook(book); bookList.setUseSize(currentSize+1); System.out.println("添加成功"); } }
DelBook:先在BookList增加一个能改变books数组内容的方法,先找图书,如果没找到,删除失败,如果找到了,得到该书的下标pos,将pos+1下标所对应的数组内容移到以下标为pos的位置上,然后pos+1,重复上述操作,所以这个需要一个for循环来实现。
在BookList中增加:
public void setBook(int pos,Book book){ books[pos]=book; }
在DelBook中:
public class DelBook 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 currentSize=bookList.getUseSize(); int i = 0; int pos=-1; for (; i <currentSize ; i++) { Book book=bookList.getBook(i); if (book.getName().equals(Name)){ System.out.println("找到了,开始删除"); pos=i; } } if (i>=currentSize) { System.out.println("此书没有,删除失败"); return; } for (int j = pos; j <currentSize-1 ; j++) { Book book1=bookList.getBook(j+1); bookList.setBook(j,book1); return; } bookList.setUseSize(currentSize-1); bookList.setBook(currentSize-1,null); System.out.println("删除成功"); } }
ExitSystem:要将数组中的内容全部置为null,防止内存泄漏。
public void work(BookList bookList) { System.out.println("退出系统"); int currentSize=bookList.getUseSize(); for (int i = 0; i <currentSize ; i++) { Book book=bookList.getBook(i); bookList.setBook(i,null); } System.exit(0); }
ReturnBook:
public class ReturnBook 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 currentSize=bookList.getUseSize(); for (int i = 0; i <currentSize ; i++) { Book book=bookList.getBook(i); if (book.getName().equals(Name)){ System.out.println("找到了!!!"); book.setLend(false); System.out.println("归还成功"); return; } } System.out.println("归还失败"); } }
BorrowBook:
public class BorrowBook 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 currentSize=bookList.getUseSize(); for (int i = 0; i <currentSize ; i++) { Book book=bookList.getBook(i); if (book.getName().equals(Name)){ System.out.println("找到了!!!"); book.setLend(true); System.out.println("借阅成功"); return; } } System.out.println("借阅失败"); } }
全部代码展示:
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 Administrator(name); }else { return new NormalUser(name); } } public static void main(String[] args) { BookList bookList=new BookList(); User user=login(); while(true){ int choice = user.menu(); user.doOperation(choice, bookList); } } }
Book
public class Book { private String name; private String author; private int price; private String type; private boolean isLend; public Book(String name, String author, int price, String type) { this.name = name; this.author = author; this.price = price; this.type = type; } 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 isLend() { return isLend; } public void setLend(boolean lend) { isLend = lend; } @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", author='" + author + '\'' + ", price=" + price + ", type='" + type + '\'' + ", isLend=" + (isLend?"已借阅":"未借阅") + '}'; } }
BookList
public class BookList { Book[] books=new Book[10]; private int useSize; public BookList(){ books[0]=new Book("三国演义","罗贯中",10,"小说"); books[1]=new Book("西游记","吴承恩",12,"小说"); books[2]=new Book("红楼梦","曹雪芹",11,"小说"); this.useSize=3; } public int getUseSize() { return useSize; } public void setUseSize(int useSize) { this.useSize = useSize; } public Book getBook(int pos){ return books[pos]; } public boolean isFull(){ return useSize==books.length; } public void setBook(Book book){ books[useSize]=book; } public void setBook(int pos,Book book){ books[pos]=book; } }
User
public abstract class User { private String name; IOperation[] iOperations=new IOperation[]{}; public User(String name) { this.name = name; } public abstract int menu(); public abstract void doOperation(int choice, BookList bookList); }
Administrator
public class Administrator extends User{ public Administrator(String name) { super(name); this.iOperations=new IOperation[]{new ExitSystem(),new FindBook(),new AddBook(), new DelBook(),new ShowBook()}; } @Override 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,退出系统"); System.out.println("**************************"); System.out.println("请输入你操作"); Scanner scanner=new Scanner(System.in); int choice=scanner.nextInt(); return choice; } @Override public void doOperation(int choice, BookList bookList) { iOperations[choice].work(bookList); } }
NormalUser
public class NormalUser extends User { public NormalUser(String name) { super(name); this.iOperations=new IOperation[]{new ExitSystem(),new FindBook(), new BorrowBook(), new ReturnBook()}; } @Override public int menu() { System.out.println("********普通用户菜单*********"); System.out.println("1,查找图书"); System.out.println("2,借阅图书"); System.out.println("3,归还图书"); System.out.println("0,退出系统"); System.out.println("**************************"); System.out.println("请输入你操作"); Scanner scanner=new Scanner(System.in); int choice=scanner.nextInt(); return choice; } @Override public void doOperation(int choice, BookList bookList) { iOperations[choice].work(bookList); } }
IOperation
public interface IOperation { void work(BookList bookList); }
AddBook
public class AddBook implements IOperation { @Override public void work(BookList bookList) { System.out.println("增加图书"); if (bookList.isFull()==true){ System.out.println("书架满了,添加失败"); return; } System.out.println("输入要增加的书名"); Scanner scanner=new Scanner(System.in); String Name=scanner.nextLine(); int currentSize=bookList.getUseSize(); 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("输入书的作者"); String author=scanner.nextLine(); System.out.println("输入书的价格"); int price=scanner.nextInt(); scanner.nextLine(); System.out.println("输入书的类型"); String type=scanner.nextLine(); Book book=new Book(Name,author,price,type); bookList.setBook(book); bookList.setUseSize(currentSize+1); System.out.println("添加成功"); } }
BorrowBook
public class BorrowBook 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 currentSize=bookList.getUseSize(); for (int i = 0; i <currentSize ; i++) { Book book=bookList.getBook(i); if (book.getName().equals(Name)){ System.out.println("找到了!!!"); book.setLend(true); System.out.println("借阅成功"); return; } } System.out.println("借阅失败"); } }
DelBook
public class DelBook 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 currentSize=bookList.getUseSize(); int i = 0; int pos=-1; for (; i <currentSize ; i++) { Book book=bookList.getBook(i); if (book.getName().equals(Name)){ System.out.println("找到了,开始删除"); pos=i; break; } } if (i>=currentSize) { System.out.println("此书没有,删除失败"); return; } for (int j = pos; j <currentSize-1 ; j++) { Book book1=bookList.getBook(j+1); bookList.setBook(j,book1); return; } bookList.setUseSize(currentSize-1); bookList.setBook(currentSize-1,null); System.out.println("删除成功"); } }
ExitSystem
public class ExitSystem implements IOperation{ @Override public void work(BookList bookList) { System.out.println("退出系统"); int currentSize=bookList.getUseSize(); for (int i = 0; i <currentSize ; i++) { Book book=bookList.getBook(i); bookList.setBook(i,null); } System.exit(0); } }
FindBook
public class FindBook 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 currentSize=bookList.getUseSize(); 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; } if(book.getAuthor().equals(Name)){ System.out.println("找到了!!!"); System.out.println(book); } } System.out.println("没有该图书!!!"); } }
ReturnBook
public class ReturnBook 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 currentSize=bookList.getUseSize(); for (int i = 0; i <currentSize ; i++) { Book book=bookList.getBook(i); if (book.getName().equals(Name)){ System.out.println("找到了!!!"); book.setLend(false); System.out.println("归还成功"); return; } } System.out.println("归还失败"); } }
ShowBook
public class ShowBook implements IOperation{ @Override public void work(BookList bookList) { System.out.println("显示图书"); int currentSize=bookList.getUseSize(); for (int i = 0; i <currentSize ; i++) { Book book=bookList.getBook(i); System.out.println(book); } } }