
设计模式-外观模式
设计模式之外观模式
1. 概述
外观模式是一种结构型设计模式,它为子系统中的一组接口提供了一个统一的入口点。外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。 简单来说,外观模式隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的简单接口。
2. 模式意图
- 简化接口: 为复杂的子系统提供一个简单的、统一的接口。
- 解耦: 降低客户端与子系统之间的耦合度。
- 易用性: 使子系统更容易使用。
- 隐藏复杂性: 隐藏子系统的内部复杂性,客户端无需了解子系统的实现细节。
3. 模式结构
外观模式主要包含以下角色:
- 外观(Facade):
- 知道哪些子系统负责处理请求。
- 将客户端的请求委派给适当的子系统对象。
- 提供一个高层接口,简化子系统的使用。
- 子系统(Subsystems):
- 实现子系统的功能。
- 处理由 Facade 类委派的请求。
- 子系统类并不知道 Facade 的存在。
- 客户端(Client):
- 通过 Facade 对象访问子系统。
- 客户端不需要直接与子系统交互。
4. 适用场景
- 当需要为一个复杂的子系统提供一个简单的接口时。
- 当客户端不希望与复杂的子系统直接交互时。
- 当需要降低客户端与子系统之间的耦合度时。
- 当需要对子系统进行分层时,可以使用外观模式定义每层的入口。
5. 模式优点
- 简化客户端的使用: 客户端无需了解子系统的复杂性,只需与外观类交互即可。
- 降低耦合度: 降低客户端与子系统之间的耦合度,提高系统的灵活性和可维护性。
- 提高可重用性: 将子系统的实现细节隐藏起来,方便子系统的重用。
- 符合最少知识原则: 客户端只需要了解外观类,而不需要了解子系统的内部实现。
6. 模式缺点
- 可能导致外观类过于庞大: 如果子系统过于复杂,外观类可能会变得非常庞大,难以维护。
- 不符合开闭原则: 如果需要修改子系统,可能需要修改外观类,这违反了开闭原则。
7. 实际应用场景
- 编译器: 编译器可以将词法分析、语法分析、代码生成等子系统的复杂性隐藏起来,提供一个简单的编译接口。
- 操作系统: 操作系统可以提供一个简单的 API 供应用程序调用,而隐藏底层的硬件操作。
- 数据库访问: 可以使用外观模式封装数据库的连接、查询、更新等操作,提供一个简单的数据库访问接口。
- 中间件: 中间件可以封装底层的网络通信、事务管理等复杂性,提供一个简单的服务调用接口。
8. 代码示例
1 | // 1. 子系统类 (Subsystem Classes) |
关键点解释:
- CPU, Memory, HardDrive (Subsystems): 这些是复杂的子系统,客户端通常需要直接与它们交互才能完成某些任务。 在这里,它们模拟计算机的不同组件。
- Computer (Facade): 外观类提供了一个简化的接口来访问子系统。 客户端只需调用外观类的方法,而无需了解子系统的复杂性。
- FacadePatternDemo (Client): 客户端类,它使用外观类来启动计算机。 客户端不需要直接与 CPU、内存或硬盘驱动器交互。
- 外观模式通过提供一个统一的接口来访问子系统,简化了客户端的使用。 客户端无需了解子系统的复杂性,只需与外观类交互即可。这降低了客户端与子系统之间的耦合度,提高了代码的可维护性和可重用性。 在这个例子中,
Computer类充当外观,它封装了启动计算机所需的复杂步骤。 客户端只需调用startComputer()方法,即可启动计算机,而无需了解 CPU、内存和硬盘驱动器之间的交互细节。
输出结果:
1 | CPU 冻结 |
9. 总结
外观模式是一种非常有用的设计模式,它可以简化客户端的使用,降低客户端与子系统之间的耦合度,提高系统的灵活性和可维护性。 然而,也需要注意外观模式的缺点,避免过度使用,导致外观类过于庞大。
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自徍正的随笔Blog








