设计模式之外观模式
Facade模式也叫做外观模式。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单界面。这个一致的简单界面别称作facade。
Facade:
为调用方定义简单的调用接口。
Clients:
调用者。通过Facade接口调用提供某功能的内部类群。
Packages:
功能提供者。值提供功能的类群(模块或子系统)。
例子:
功能提供者A:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.Design.Facade; /** * @ClassName: SystemA * @Description: A子系统 * @author * @date 2018年4月9日 下午10:37:17 * @version 1.0 */ public class SystemA { /** * @Title: doSomething * @Description: B子系统实现功能 * @param * @return void * @throws */ public void doSomething(){ System.out.println("实现A子系统的功能"); } }
功能提供者B:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.Design.Facade; 2 3 /** 4 * @ClassName: SystemB 5 * @Description: B子系统 6 * @author 7 * @date 2018年4月9日 下午10:37:17 8 * @version 1.0 9 */ 10 public class SystemB { 11 12 /** 13 * @Title: doSomething 14 * @Description: B子系统实现功能 15 * @param 16 * @return void 17 * @throws 18 */ 19 public void doSomething(){ 20 System.out.println("实现B子系统的功能"); 21 } 22 }
功能提供者C:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.Design.Facade; 2 3 /** 4 * @ClassName: SystemC 5 * @Description: C子系统 6 * @author 7 * @date 2018年4月9日 下午10:37:17 8 * @version 1.0 9 */ 10 public class SystemC { 11 12 /** 13 * @Title: doSomething 14 * @Description: C子系统实现功能 15 * @param 16 * @return void 17 * @throws 18 */ 19 public void doSomething(){ 20 System.out.println("实现C子系统的功能"); 21 } 22 }
调用接口Facade:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.Design.Facade; 2 3 /** 4 * @ClassName: Facade 5 * @Description: 外观模式的调用接口 6 * @author 7 * @date 2018年4月9日 下午11:26:40 8 * @version 1.0 9 */ 10 public class Facade { 11 12 private SystemA systemA; 13 private SystemB systemB; 14 private SystemC systemC; 15 16 public Facade() { 17 systemA = new SystemA(); 18 systemB = new SystemB(); 19 systemC = new SystemC(); 20 21 } 22 23 public void doSomething() { 24 this.systemA.doSomething(); 25 this.systemB.doSomething(); 26 this.systemC.doSomething(); 27 } 28 29 public void doABC() { 30 this.systemA.doSomething(); 31 this.systemB.doSomething(); 32 this.systemC.doSomething(); 33 } 34 35 public void doAB() { 36 this.systemA.doSomething(); 37 this.systemB.doSomething(); 38 } 39 40 public void doBC() { 41 this.systemB.doSomething(); 42 this.systemC.doSomething(); 43 } 44 45 46 }
客户端代用代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.Design.Facade; 2 3 public class MainClass { 4 5 public static void main(String[] args) { 6 7 8 Facade facade = new Facade(); 9 // facade.doAB(); 10 facade.doAB(); 11 12 13 14 } 15 16 }
综上:其实就是,将一个模块功能的引用交给一个类;然后,该类进行不同的组合调用。