学习目标:
- 信息专家模式举个例子详细介绍
学习内容:
信息专家(Information Expert)模式是一种常用的设计模式,用于将某个职责(或功能)赋予拥有该职责所需信息的类。这有助于保持类的高内聚性和低耦合性,从而提高系统的可维护性和可扩展性。
例子:图书馆管理系统
问题描述
在一个图书馆管理系统中,需要计算每个会员的借书总数。系统中包含以下类:
- LibraryMember(会员类):表示图书馆的会员,包含会员的基本信息。
- Book(书籍类):表示图书馆中的书籍,包含书籍的基本信息。
- Loan(借书类):表示会员的借书记录,包含借书的相关信息。
设计解决方案
步骤1:确定职责
需要计算某个会员的借书总数。这意味着我们需要遍历该会员的所有借书记录。
步骤2:选择信息专家
考虑到哪个类拥有计算借书总数所需的信息。显然,LibraryMember类包含会员的基本信息,并且应该能够访问会员的借书记录。
步骤3:实现职责
将计算借书总数的职责赋予LibraryMember类,因为它是拥有借书记录信息的类。
**// 借书类**
public class Loan {
private Book book;
private Date loanDate;
public Loan(Book book, Date loanDate) {
this.book = book;
this.loanDate = loanDate;
}
public Book getBook() {
return book;
}
public Date getLoanDate() {
return loanDate;
}
}
// 会员类
import java.util.List;
public class LibraryMember {
private String memberId;
private String name;
private List<Loan> loans;
public LibraryMember(String memberId, String name, List<Loan> loans) {
this.memberId = memberId;
this.name = name;
this.loans = loans;
}
public String getMemberId() {
return memberId;
}
public String getName() {
return name;
}
public List<Loan> getLoans() {
return loans;
}
// 计算借书总数的方法
public int getTotalNumberOfLoans() {
return loans.size();
}
}
// 书籍类
public class Book {
private String bookId;
private String title;
public Book(String bookId, String title) {
this.bookId = bookId;
this.title = title;
}
public String getBookId() {
return bookId;
}
public String getTitle() {
return title;
}
}
解释
- Loan类表示一个借书记录,包含书籍信息和借书日期。
- LibraryMember类表示图书馆的会员,包含会员ID、姓名和借书记录列表(List)。
- 在LibraryMember类中,添加了一个方法getTotalNumberOfLoans,用于计算该会员的借书总数。
通过将计算借书总数的职责赋予LibraryMember类,我们利用信息专家模式,使职责分配合理,类的设计更加内聚且低耦合。这不仅简化了系统结构,还提高了代码的可维护性和可扩展性。