面向对象设计大作业—图书馆
1.功能调查与系统功能框图
-
用户能使用图书馆进行借书还书操作。
-
而图书馆中能查找书籍,也能对书库进行添加书籍和删除书籍的操作。
-
能够查阅借阅记录,用户能查自身借阅记录,图书馆管理员能查到所有图书的借阅记录。
2.类的设计
-
User类 和 Administrator类 都继承于 Operator类:
都需要进行登入,继承Operator的修改密码的方法 -
User类 和 Administrator类 分别都依赖 Library类 而操作:
User 从 Library中进行借书、还书等操作。
Administrator 对 Library 进行操作,可以直接调用Library的方法
-
Book类 和 BorrowRecord类 相互依赖:
BorrowRecord类有Book类的属性,Book中也有BorrowRecord类的属性。 -
Library类 依赖于 Book类:
Library 中有 Book类的 书目列表
3.类说明
3.1 Book类
-
主要属性:
-
private List
records;//用来保存该书被借阅的记录
书籍借阅呈线性表方式存储记录。 -
private int id;//区别每本书的书本编号
-
private String name;//书名
-
private String author;//作者
-
private String type;//类别
-
private String briefIntroduction;//书籍简介
-
-
主要方法:
public String toString() ;//覆盖toString方法,输出书籍相关信息
public class Book {
private int id;
private String name;
private String author;
private String type;
private String briefIntroduction;
private List<BorrowRecord> records;
public Book(int id, String name, String author, String type, String briefIntroduction) {
this.id = id;
this.name = name;
this.author = author;
this.type = type;
this.briefIntroduction = briefIntroduction;
this.records=new ArrayList<BorrowRecord>();
}
@Override
public String toString() {
return "[书籍编号:"+id+"书名:《" + name +"》,"+ "作者: "+ author + ", 类别:" + type + ", 简介:"
+ briefIntroduction + "]";
}
....//Getters and Setters
}
3.2 Library类
-
主要属性:
-
Map<Book,String> bookList;
** bookList 作为 library 的图书列表即(书库)**
用Map容器映射 book(书籍) -> state(状态) 是为了 能够反映图书的状态,以此来判断是否能被借出。 -
主要方法:
- public boolean searchBooks (Book book);//在图书馆书库中查找图书功能
- public void addBooks(Book book);//往图书馆书库中添加新书
- public boolean deleteBooks(Book book);//删除图书馆书库中的指定书籍
- public void showBookList();//展示书库中的所有书籍
public class Library {
Map<Book,String> bookList;
public Library() {
bookList = new HashMap<Book, String>();
}
public boolean searchBooks(Book book) {//在图书馆书库中查找图书功能
if(bookList.containsKey(book))
return true;
else
return false;
}
public void addBooks(Book book) {//往图书馆书库中添加新书
bookList.put(book, "free");
}
public boolean deleteBooks(Book book) {//删除图书馆书库中的指定书籍
if(this.searchBooks(book)) {
bookList.remove(book);
return true;
}
else
return false;
}
public void showBookList() {//展示书库中的所有书籍
Set<Book> keySet = bookList.keySet();
Iterator<Book> it =keySet.iterator();
while(it.hasNext()){
Book book=it.next();
String state = bookList.get(book);
System.out.println(book+"="+state);
}
}
....//Getters and Setters
}
3.2 Operator类
-
主要属性:
-
private static Map<String, String> matchItems = new HashMap<String, String>();//账号密码匹配信息
这是一个属于类的属性。 使用Map方便进行账号密码的匹配操作 -
private String id;//账号
-
private String password;//密码
-
private String name;//姓名
-
主要方法:
-
public static boolean login(String id, String password);//登入方法
** 定义为static,作为该类的方法。** -
public void changePassword(String password);//修改密码
public class Operator {
private String id;
private String password;
private String name;
private static Map<String, String> matchItems = new HashMap<String, String>();
public Operator(String id, String password, String name) {
this.id = id;
this.password = password;
this.name = name;
matchItems.put(id, password);
}
public static boolean login(String id, String password) {//登入方法
if (matchItems.containsKey(id)) {
if (matchItems.get(id).equals(password))
return true;
else
return false;
} else
return false;
}
public void changePassword(String password) {//修改密码
matchItems.replace(this.id, password);
}
....//Getters and Setters
}
3.3 User类
-
主要属性:
-
private Set
borrowingBooks;//正在借阅的书籍
该属性方便查阅用户正在借阅的书籍,Set集合的contains方法确保没有重复元素出现,符合该书被该用户借阅的唯一性。 -
private List
records; //该用户自身借阅记录
该用户自己的借阅记录呈线性表方式记录下来。
-
-
主要方法:
- public boolean borrowBook(Library library, Book book);//借阅图书
- public boolean returnBooks(Library library, Book book);//归还图书
- public void showBorrowingBooks() ;//查看自身正在借阅的书籍
- public void showRecords() ;//查看自身所有的借阅记录
- public boolean borrowBook(Library library, Book book);//借阅图书
public class User extends Operator {
private Set<Book> borrowingBooks;// 正在借阅、即待还书籍
private List<BorrowRecord> records;//自身借阅记录
public User(String id, String password, String name) {
super(id, password, name);
this.borrowingBooks = new HashSet<Book>();
this.records = new ArrayList<BorrowRecord>();
}
public boolean borrowBook(Library library, Book book) {//借阅图书
if (library.getBookList().containsKey(book)) {
if (library.getBookList().get(book).equals("free")) {// 书籍状态为可借
// 借书
borrowingBooks.add(book);
library.bookList.replace(book, "borrowed");
BorrowRecord record = new BorrowRecord(book, this, "borrowed");// 更新用户和书籍的借阅记录
records.add(record);
book.getRecords().add(record);
return true;
} else// 该书已被借,借阅失败
return false;
} else
return false;// 图书馆无该书
}
public boolean returnBooks(Library library, Book book) {//归还图书
if (borrowingBooks.contains(book)) {
library.getBookList().replace(book, "free");
BorrowRecord record = new BorrowRecord(book, this, "free");// 更新用户和书籍的借阅记录
records.add(record);
book.getRecords().add(record);
borrowingBooks.remove(book);
return true;
} else
return false;
}
public void showBorrowingBooks() {//查看自身正在借阅的书籍
Iterator<Book> it = borrowingBooks.iterator();
while (it.hasNext()) {
Book book = it.next();
System.out.println(book);
}
}
public void showRecords() {//查看自身所有的借阅记录
BorrowRecord b;
for (int i = 0; i < records.size(); i++) {
b = records.get(i);
System.out.println(b);
}
}
....//Getters and Setters
}
3.5 Administrator类
-
主要属性:
private Library library;// 所管理的图书馆
得到所管理的图书馆,方便后续直接调用图书馆的方法,即能操作图书馆。 -
主要方法:
public void showBorrowRecord();//查阅图书馆中所有的借阅记录
public class Administrator extends Operator {
private Library library;// 所管理的图书馆
public Administrator(String id, String password, String name, Library library) {
super(id, password, name);
this.library = library;
}
public void showBorrowRecord() {//查阅图书馆中所有的借阅记录
Set<Book> books = library.getBookList().keySet();
Iterator<Book> it = books.iterator();
while (it.hasNext()) {
Book book = it.next();
System.out.println(book.getRecords());
}
}
....//Getters and Setters
}
4.系统的包的规划
-
package model//存放实体类
public class Library;
public class Book ;
public class BorrowRecord
public class Operator;
public class User extends Operator ;
public class Administrator extends Operator -
package ui
public class Main;//控制台界面
public class ShowMenu;//展示界面
5.查看借阅记录功能
public class BorrowRecord {
private Book book;
private User user;
private String state;
...
}
-
BorrowRecord类 是一条借阅记录条目。
其中包括借阅信息有:借阅的书籍,借书的人,以及借阅状态 -
User类中含有 BorrowRecord类的records属性,存储了用户个人的借阅记录
-
Book类中同样含有 BorrowRecord类的records属性,是该书的借阅记录
-
在用户借阅和归还书籍的时候,User和Book的借阅记录同步更新。