外观模式属于设计模式中的结构型模式,主要适用于存在众多接口并需要按照不同顺序调用的场合,它可以为子系统的众多接口提供统一的高层调用接口,使子系统更容易使用。简单来说,外观模式就是对接口进行组合并封装成高一级的接口的模式。
举一个例子,快餐店里有许多类型的食物(类似于子系统中的接口),顾客想吃不同的食物时就需要自己去挑选(相当于其他业务组去调用不同的接口),如果快餐店自己把大多数顾客想吃的食物搭配组合起来推出套餐,那么顾客点餐就方便快捷得多,会获得比较好的体验(组合调用接口的舒适度提升)。当然,快餐店也支持顾客自己自由搭配,不是非套餐不可(不影响接口的可重用性)。
外观模式就相当于快餐店的各个套餐,对于需要重复调用的接口组合方案,我们可以新建一个中间层,由中间层给调用方提供各式各样的“套餐”。
首先是子系统的接口方法定义(这里只列举一个子系统)
public class SubSystemA { public void methodA(){ System.out.println("接口A"); } }然后是编写中间接口:
public void comboMethod1(){ SubSystemA subSystemA = new SubSystemA(); SubSystemB subSystemB = new SubSystemB(); SubSystemC subSystemC = new SubSystemC(); //对于执行顺序有严格要求的组合,外观模式也能进行很好地处理 System.out.println("调用中间接口1:"); subSystemA.methodA(); subSystemB.methodB(); subSystemC.methodC(); System.out.println(); } public void comboMethod2(){ SubSystemA subSystemA = new SubSystemA(); SubSystemD subSystemD = new SubSystemD(); SubSystemE subSystemE = new SubSystemE(); //对于执行顺序有严格要求的组合,外观模式也能进行很好地处理 System.out.println("调用中间接口2:"); subSystemA.methodA(); subSystemD.methodD(); subSystemE.methodE(); System.out.println(); }最后是测试代码:
public static void main(String[] args) { //中间接口在FacadePatterns类中定义,所以需要创建该类实例对象 FacadePatterns facade = new FacadePatterns(); //调用中间接口1 facade.comboMethod1(); //调用中间接口2 facade.comboMethod2(); }