在图书馆管理系统中首要有两个角色,普通用户(1.查找书籍、2.借阅书籍、3.归还书籍)与管理员(1.查找书籍、2.增加书籍、3.删除书籍、4.打印所有的书籍信息)。在我们设计类的过程中 ,可从需求中找出关键字,其中包括有:单本书籍Book,所有书BookList,普通用户NormalUser,管理员Admin等,对于具体操作将之理解成名词,每个操作对应到一个类,User类只要持有这些类的实例就可以了,其中我的图书管理系统文件下包含三个包(Book、User、IOperation)以及一个测试类(main)。
1、Book包下包含两个类,Book和BookList
(1)Book类
package Book;
public class Book {
private String name;
private String id;
private String author;
private int price;
private String type;
private boolean isBorrowed;
public Book(String name, String id, String author,
int price, String type, boolean isBorrowed) {
super();
this.name = name;
this.id = id;
this.author = author;
this.price = price;
this.type = type;
this.isBorrowed = isBorrowed;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Book [name=" + name + ", id=" + id + ", author=" + author + ", price=" + price + ", type=" + type
+ ", isBorrowed=" + isBorrowed + "]";
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean isBorrowed) {
this.isBorrowed = isBorrowed;
}
}
(2)BookList类
package Book;
public class BookList {
private Book[] books = new Book[100];
private int size;
public BookList() {
books[0] = new Book("红楼梦","001","曹雪芹",100,"古典名著",false);
books[1] = new Book("水浒装","002","施耐庵",100,"古典名著",false);
books[2] = new Book("西游记","003","吴承恩",100,"古典名著",false);
size=3;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public Book getBook(int index) {
return books[index];
}
public void setBook(int index,Book book) {
books[index]=book;
}
}
2、User包下包含三个类:User、NormalUser、Admin
(1)User类
package User;
import Book.BookList;
import Operation.IOperation;
abstract public class User {
protected String name;
//持有当前用户支持的操作对象
protected IOperation[] operations;
public User(String name) {
this.name = name;
}
//打印一个操作菜单
//不同用户支持的操作不同
//对应的菜单也就不同
abstract public int menu();
//根据用户输入的选项(menu返回结果)
//调用对应的操作对象
public void doOperation(int choice, BookList BookList) {
operations[choice].work(BookList);
}
}
(2)NormalUser类
package User;
import Book.BookList;
import Operation.IOperation;
abstract public class User {
protected String name;
//持有当前用户支持的操作对象
protected IOperation[] operations;
public User(String name) {
this.name = name;
}
//打印一个操作菜单
//不同用户支持的操作不同
//对应的菜单也就不同
abstract public int menu();
//根据用户输入的选项(menu返回结果)
//调用对应的操作对象
public void doOperation(int choice, BookList BookList) {
operations[choice].work(BookList);
}
}
(3)Admin类
package User;
import java.util.Scanner;
import Operation.AddOperation;
import Operation.DelOperation;
import Operation.ExitOperation;
import Operation.FindOperation;
import Operation.IOperation;
import Operation.PrintAllOperation;
public class Admin extends User {
public Admin(String name) {
super(name);
operations = new IOperation[] {
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new PrintAllOperation()
};
}
@Override
public int menu() {
System.out.println("============");
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("============");
System.out.println("请输入您的选择:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
3、IOperation包下包含八个主要操作类
package Operation;
import Book.BookList;
//共同接口IOperation,重写work方法,针对bookList来操作
public interface IOperation {
void work (BookList bookList);
}
增加书籍
package Operation;
import java.util.Scanner;
import Book.Book;
import Book.BookList;
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.next();
System.out.println("请输入编号:");
String id = scanner.next();
System.out.println("请输入作者");
String author = scanner.next();
System.out.println("请输入价格");
int price = scanner.nextInt();
System.out.println("请输入类别");
String type= scanner.next();
Book book = new Book(name,id,author,price,type,false);
//链表的尾插
bookList.setBook(bookList.getSize(), book);
bookList.setSize(bookList.getSize()+1);
}
}
借阅书籍
package Operation;
import java.util.Scanner;
import Book.Book;
import Book.BookList;
public class BorrowOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("借阅书籍");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要借阅的书籍的编号:");
String id = scanner.next();
for(int i=0;i<bookList.getSize();i++) {
Book book = bookList.getBook(i);
if(!book.getId().equals(id)) {
continue;
}
if(book.isBorrowed()) {
System.out.println("该书已被借走");
break;
}
book.setBorrowed(true);
}
}
}
删除书籍
package Operation;
import java.util.Scanner;
import Book.Book;
import Book.BookList;
public class DelOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("删除书籍");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要删除的编号:");
String id = scanner.next();
//先查找
int i=0;
for(;i<bookList.getSize();i++) {
Book book = bookList.getBook(i);
if(book.getId().equals(id)) {
//找到了
break;
}
}
if(i>= bookList.getSize()) {
//没找到
System.out.println("未找到要删除的书籍");
return;
}
//处理找到了的情况
//直接用最后一个元素覆盖当前要删除的元素
Book lastBook = bookList.getBook(bookList.getSize()-1);
bookList.setBook(i, lastBook);
bookList.setSize(bookList.getSize()-1);
System.out.println("删除成功");
}
}
退出系统
package Operation;
import Book.BookList;
public class ExitOperation implements IOperation {
//把操作提取成类,实际是进一步把操作和用户之间进行了“解耦合”
//耦合是两个代码之间的关联关系,越低越好
@Override
public void work(BookList bookList) {
System.out.println("goodbye!");
//0为“进程退出码”
System.exit(0);
}
}
查找书籍
package Operation;
import java.util.Scanner;
import Book.Book;
import Book.BookList;
public class FindOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("查找书籍");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要查找的书名");
String name = scanner.next();
int count = 0;
for(int i=0;i<bookList.getSize();i++) {
Book book = bookList.getBook(i);
if(book.getName().equals(name)) {
//打印书籍的信息
System.out.println(book);
count++;
}
}
if(count == 0) {
System.out.println("未找到书籍");
}else {
System.out.println("找到了"+count+"本书");
}
}
}
打印书籍
package Operation;
import Book.BookList;
public class PrintAllOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("打印所有书籍信息");
for(int i=0;i<bookList.getSize();i++) {
System.out.println(bookList.getBook(i));
}
System.out.println("共计"+bookList.getSize()+"本书。");
}
}
归还书籍
package Operation;
import java.util.Scanner;
import Book.Book;
import Book.BookList;
public class ReturnOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("归还书籍");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要归还的书籍的编号:");
String id = scanner.next();
for(int i=0;i<bookList.getSize();i++) {
Book book = bookList.getBook(i);
if(!book.getId().equals(id)) {
continue;
}
if(!book.isBorrowed()) {
System.out.println("该书已被归还");
break;
}
book.setBorrowed(false);
}
}
}
4、测试类:
import java.util.Scanner;
import Book.BookList;
import User.Admin;
import User.NormalUser;
import User.User;
public class main {
public static void main(String[] args) {
//程序的入口
//1、准备好书籍信息数据
BookList bookList = new BookList();
//2、创建用户
User user = login();
//3、进入主循环
while(true) {
int choice = user.menu();
user.doOperation(choice, bookList);
}
}
public static User login() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的姓名:");
String name = scanner.next();
System.out.println("请输入您的角色:(1.普通用户 2.管理员)");
int role = scanner.nextInt();
if(role == 1) {
return new NormalUser(name);
}
return new Admin(name);
}
}