理解名词
门面模式(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