目录
意图
- 为子系统中的一组接口提供统一的接口。Facade 定义了一个更高级别的接口,使子系统更易于使用。
- 用更简单的接口包装复杂的子系统。
问题
客户社区的一部分需要一个简化的接口来连接复杂子系统的整体功能。
讨论
Facade 讨论了将复杂的子系统封装在单个接口对象中。这减少了成功利用子系统所需的学习曲线。它还促进了子系统与其潜在的许多客户的分离。另一方面,如果 Facade 是子系统的唯一接入点,它将限制“高级用户”可能需要的功能和灵活性。
Facade 对象应该是一个相当简单的倡导者或促进者。它不应该成为一个无所不知的神谕或“神”对象。
结构
Facade 采用了一个“笼罩在谜团中的谜团”,并插入了一个包装器,可以驯服大量无定形和难以理解的软件。

SubsystemOne并且SubsystemThree不与SubsystemTwo. 他们使用SubsystemTwoWrapper“外观”(即更高级别的抽象)。

例子
Facade 为子系统定义了一个统一的、更高级别的接口,使其更易于使用。消费者在从目录中订购时会遇到 Facade。消费者拨打一个号码并与客户服务代表交谈。客户服务代表充当门面,为订单履行部门、计费部门和运输部门提供接口。

检查清单
- 为子系统或组件确定一个更简单、统一的接口。
- 设计一个封装子系统的“包装器”类。
- 外观/包装器捕获组件的复杂性和协作,并委托给适当的方法。
- 客户端仅使用(耦合到)外观。
- 考虑额外的外墙是否会增加价值。
经验法则
- Facade 定义了一个新的接口,而 Adapter 使用了一个旧的接口。请记住,适配器使两个现有接口协同工作,而不是定义一个全新的接口。
- Flyweight 展示了如何制作大量小对象,而 Facade 展示了如何使单个对象代表整个子系统。
- Mediator 类似于 Facade,因为它抽象了现有类的功能。中介者抽象/集中了同事对象之间的任意通信。它通常会“增加价值”,并且被同事对象知道/引用。相反,Facade 为子系统定义了一个更简单的接口,它不添加新功能,并且子系统类不知道它。
- Abstract Factory 可以用作 Facade 的替代方法来隐藏特定于平台的类。
- 外观对象通常是单例,因为只需要一个外观对象。
- Adapter 和 Facade 都是包装器;但它们是不同类型的包装器。Facade 的目的是产生一个更简单的接口,而 Adapter 的目的是设计一个现有的接口。而 Facade 通常包装多个对象,而 Adapter 包装单个对象;Facade 可以前端单个复杂对象,而 Adapter 可以包装多个遗留对象。
问:那么区分Adapter模式和Facade模式的方法是Adapter包装了一个类,而Facade可能代表多个类?
回答:不!请记住,适配器模式将一个或多个类的接口更改为客户期望的一个接口。虽然大多数教科书示例显示适配器适配一个类,但您可能需要适配许多类以提供客户端编码到的接口。同样,Facade 可以为具有非常复杂接口的单个类提供简化的接口。两者之间的区别不在于它们“包装”了多少类,而在于它们的意图。
本文来自转载,原文链接: