定义

  1. 又叫门面模式
  2. 为子系统中的一组接口提供一个一致的界面,此模型定义了一个高层接口。这个接口使得这一子系统更加容易使用
  3. 就是对内部的方法进行封装,方便供外部调用(外部调用不用关注子系统实现细节)

使用场景

  1. 三层架构,界面层、逻辑层、数据层,层与层之间建立外观Facade
  2. 购买基金与单独购买股票区别,基金就是一个门面,包含了多支股票的买入卖出,用户不用关注每一支股票的买入卖出,直接操作基金即可
  3. 电脑的开机和关机,外观就是开关机,具体细节用户不用处理(比如启动关闭cpu、内存、硬盘、电源等)

代码实现

//子系统
public class SystemA
{
    public void MethodA(){ }
}

//子系统
public class SystemB
{
    public void MethodB(){ }
}

//子系统
public class SystemC
{
    public void MethodC() { }
}

//外观类 门面类
class Facade
{
   private SystemA sysA;
   private SystemB sysB;
   private SystemC sysC;

   public Facade()
  {
       sysA = new SystemA();
       sysB = new SystemB();
       sysC = new SystemC();
  }

   //统一调用方法
   public void MethodA()
   {
         sysA.MethodA();
         sysB.MethodB();
   } 

   //统一调用方法
   public void MethodB()
   {
         sysA.MethodA();
         sysC.MethodC();
   }
     
}


void Main()
{
     Facade fa = new Facade();
     fa.MethodA();
     fa.MethodB();
}

考虑使用外观模式的场景:

  1. 设计初期,将不同层分离,层与层建立外观模式
  2. 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口
  3. 维护大型的遗留系统的时候,维护和扩展很难,又需要包含重要的功能,
    为其开发一个外观类,方便新系统与遗留系统交互

优点

  1. 体现 依赖倒转原则(电脑组装例子)和迪米特法则(子系统与门面认识,与客户端陌生)的思想
  2. 松散耦合: 松散了客户端与子系统的耦合关系,让子系统内部模块能更容易维护和扩展
  3. 简单易用:门面模式让子系统更加易用,客户端不再需要了解子系统的内部实现,也不需要跟子系统进行交互,和门面进行交互即可
  4. 更好划分层次:把一部分方法对外开放,一部分方法对内开放,也方便维护

缺点

  1. 不符合开闭原则,修改某个相关的子系统,对应外观类也需要一起修改