FACADE(外观)模式

外观模式是一种对象结构型模式,旨在为复杂的子系统提供一个统一的高层次接口,降低客户端与子系统的耦合度。它通过Facade角色协调多个子系统的工作,简化客户端的使用。在增加新子系统时,可能需要修改外观类,但可能会违反开闭原则。适用场景包括简化子系统接口、构建层次结构系统和隔离子系统变化。相关模式包括Abstract Factory和Mediator模式。
摘要由CSDN通过智能技术生成


Facade(外观)模式思维导图

描述

定义

为现有多个复杂的子系统提供一个一致的高层接口,降低访问内部复杂子系统的复杂度,简化客户端与之的接口。也称为门面模式。

类型

对象结构型模式

UML类图

Facade模式UML类图

时序图

Facade模式时序图

实现

主要角色

  • Facade:外观角色
    • 知道哪些子系统类负责处理请求;
    • 将客户的请求代理给适当的子系统对象;
    • 为多个子系统对外提供一个一致的接口。
  • Subsystem:子系统角色
    • 实现子系统的功能;
    • 处理由Facade对象指派的任务;
    • 不知道Facade的任何相关信息,即没有指向facade的指针。
  • Client:客户端角色
    • 通过外观角色提供的接口使用各个子系统的功能。

代码示例

  • Facade:外观角色

      public class Facade {
          private SubSystemA subA = new SubSystemA();
          private SubSystemB subB = new SubSystemB();
          private SubSystemC subC = new SubSystemC();
    
          public void wrapOprationA() {
              subA.operation();
              subB.operation();
          }
    
      	public void wrapOprationB() {
              subC.operation();
          }
      }
    
  • Subsystem:子系统角色

      public class SubSystemA {
          public void operation() {
              System.out.println("执行SubSystemA的operation");
          }   
      }
      
      public class SubSystemB {
          public void operation() {
              System.out.println("执行SubSystemB的operation");
          }   
      }
      
      public class SubSystemC {
          public void operation() {
              System.out.println("执行SubSystemC的operation");
          }   
      }
    
  • Client:客户端角色

      public class Client {
          public static void main(String[] args) {
              Facade f = new Facade();
              f.wrapOprationA();
          }
      }
    

适用场景

  • 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
  • 当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。

优点

  • 对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
  • 实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。
  • 如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和通用性之间加以选择。

缺点

  • 使得设计更加复杂,客户端需要花更多时间理清类之间的层次关系。
  • 在增加新构件时很难对容器中的构件类型进行限制。在需要检测组件类型时,不能依靠编译期的类型约束来实现,必须在运行期间动态检测。
  • 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

相关模式

  • Abstract Factory模式可以与Facade模式一起使用以提供一个接口,这一接口可用来以一种子系统独立的方式创建子系统对象。Abstract Factory也可以代替Facade模式隐藏那些与平台相关的类。
  • Mediator模式与Facade模式的相似之处是,它抽象了一些已有的类的功能。然而,Mediator的目的是对同事之间的任意通讯进行抽象,通常集中不属于任何单个对象的功能。Mediator的同事对象知道中介者并与它通信,而不是直接与其他同类对象通信。相对而言,Facade模式仅对子系统对象的接口进行抽象,从而使它们更容易复用;它并不定义新功能,子系统也不知道facade的存在。
  • 通常来讲,仅需要一个Facade对象,因此Facade对象通常属于Singleton模式。
  • 外观模式主要是提供一个一致的接口给客户端。而Adapter模式是将一个接口通过适配来间接转换为另一个接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值