「手写设计模式」门面模式

132 阅读2分钟

理解名词

门面模式(Facade Design Pattern),也叫外观模式。在 GoF 的《设计模式》一书中,定义如下:

Provide a unified interface to a set of interfaces in a subsystem. Facade Pattern defines a higher-level interface that makes the subsystem easier to use.门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。

门面模式强调迪米特法则(最少知识原则)和接口隔离原则:两个有交互的系统,只暴露有限的必要的接口。

和适配器模式的区别:

  • 适配器是做接口转换,注重的是兼容性,解决的是原接口和目标接口不匹配的问题。
  • 门面模式做接口整合,注重的是易用性,解决的是多接口调用带来的问题。

作用

门面模式提供更抽象的接口,封装底层实现细节,减少系统间的耦合,让子系统更加易用。

适用场景

  • 解决易用性问题,例如Linux 系统调用函数,Linux 的 Shell 命令
  • 解决性能问题,通过将多个接口调用替换为一个门面接口调用,减少网络通信成本,提高客户端的响应速度。
  • 解决分布式事务问题,将多个读写数据库的接口调用聚合到一个接口中,利用数据库事务和Spring事务保证对数据库操作的事务性。

代码示例

用门面模式实现一个画图类

public class ShapeMaker {
 
   // 门面-画汽车方法
   public void drawCar(){
       drawRectangle();
       drawCircle();
       drawCircle();
   }
   
   // 门面-画奥运五环方法
   public void drawFiveRing(){
       drawCircle();
       drawCircle();
       drawCircle();
       drawCircle();
       drawCircle();
   }
   
   // 基础画圆方法
   public void drawCircle(){
       System.out.println("Draw Circle");
   }
   
   // 基础画矩形方法
   public void drawRectangle(){
       System.out.println("Draw Rectangle");
   }
   
   // 基础画正方形操作
   public void drawSquare(){
       System.out.println("Draw Square");
   }
}

使用示例

public class FacadePatternDemo {
   public static void main(String[] args) {
      ShapeMaker shapeMaker = new ShapeMaker();
 
      shapeMaker.drawCar();
      shapeMaker.drawFiveRing(); 
   }
}

业界经典实现

  • Linux 系统调用,Shell