设计模式-外观模式
外观模式(Facade Pattern)是一种结构型设计模式,用于为复杂的子系统提供一个统一的接口。外观模式的目的是简化客户端与子系统之间的交互,让客户端无需了解子系统的内部实现,只需要通过外观类即可与整个子系统交互。
外观模式的关键点:
- 简化接口:通过外观类统一子系统的多个复杂接口,降低使用复杂度。
- 隐藏复杂性:客户端无需知道子系统的细节,只需要与外观类交互。
- 解耦:客户端与子系统解耦,有助于子系统的独立开发和维护。
外观模式的组成部分:
- 外观类(Facade):
- 提供统一的接口,将复杂的子系统接口简化。
- 子系统(Subsystem):
- 一个或多个类组成的复杂系统,提供各种具体的功能。
- 客户端(Client):
- 使用外观类与子系统交互。
示例代码:银行业务办理
问题背景
假设银行系统中有多个子系统,如开户、验证身份、发放银行卡等。客户端需要通过外观类调用这些功能,避免直接操作各个子系统。
实现代码
// 子系统 1:身份验证
class IdentityCheck {
public boolean verifyIdentity(String userId) {
System.out.println("验证身份信息:" + userId);
return true; // 简化为总是验证成功
}
}
// 子系统 2:账户服务
class AccountService {
public void createAccount(String userId) {
System.out.println("为用户 " + userId + " 创建账户");
}
}
// 子系统 3:银行卡服务
class CardService {
public void issueCard(String userId) {
System.out.println("为用户 " + userId + " 发放银行卡");
}
}
// 外观类
class BankFacade {
private IdentityCheck identityCheck;
private AccountService accountService;
private CardService cardService;
public BankFacade() {
this.identityCheck = new IdentityCheck();
this.accountService = new AccountService();
this.cardService = new CardService();
}
// 统一的对外方法
public void openAccount(String userId) {
if (identityCheck.verifyIdentity(userId)) {
accountService.createAccount(userId);
cardService.issueCard(userId);
System.out.println("账户开立成功!");
} else {
System.out.println("身份验证失败,无法开立账户");
}
}
}
// 客户端
public class FacadePatternExample {
public static void main(String[] args) {
BankFacade bankFacade = new BankFacade();
bankFacade.openAccount("用户123"); // 客户端通过外观类调用
}
}
输出结果
验证身份信息:用户123
为用户 用户123 创建账户
为用户 用户123 发放银行卡
账户开立成功!
外观模式的优点
- 简化使用:客户端只需要与外观类交互,无需了解子系统的复杂逻辑。
- 降低耦合:客户端与子系统解耦,子系统的变更不会直接影响客户端。
- 提高可维护性:子系统可以独立修改,外观类也可以灵活扩展。
外观模式的适用场景
- 简化复杂系统的使用:当系统内部非常复杂,且客户端只需要其中部分功能时。
- 解耦:当需要将客户端与子系统之间的耦合关系最小化时。
- 统一入口:提供一个统一的接口来访问多个子系统。
外观模式非常适合应用于实际开发中,比如服务调用封装、模块之间的隔离等场景。