10,外观模式
一,概念
Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。
二,例子
结构
三个要素
子系统角色(Subsystem classes):功能提供者。指提供功能的类群(模块或子系统)。
外观角色(Facade):为调用方定义简单的调用接口。是模式的核心,他被客户client角色调用,知道各个子系统的功能。同时根据客户角色已有的需求预订了几种功能组合。
客户角色(Clients):调用者。通过Facade接口调用提供某功能的内部类群。
子系统角色(Subsystem classes):SystemA,SystemB,SystemC
/** * * @类名称:SystemA * @类描述:子系统角色(Subsystem classes) * @创建人:zender */ public class SystemA { /* * A子系统实现功能 */ public void doSomething() { System.out.println("实现A子系统功能"); } } /** * * @类名称:SystemB * @类描述:子系统角色(Subsystem classes) * @创建人:zender */ public class SystemB { /* * B子系统实现功能 */ public void doSomething() { System.out.println("实现B子系统功能"); } } /** * * @类名称:SystemC * @类描述:子系统角色(Subsystem classes) * @创建人:zender */ public class SystemC { /* * C子系统实现功能 */ public void doSomething() { System.out.println("实现C子系统功能"); } }
外观角色(Facade):SystemFacade
/** * * @类名称:SystemFacade * @类描述:外观角色(Facade) * @创建人:zender */ public class SystemFacade { private SystemA systemA; private SystemB systemB; private SystemC systemC; public SystemFacade() { this.systemA = new SystemA(); this.systemB = new SystemB(); this.systemC = new SystemC(); } public void doABC() { this.systemA.doSomething(); this.systemB.doSomething(); this.systemC.doSomething(); } public void doAB() { this.systemA.doSomething(); this.systemB.doSomething(); } }
客户角色(Clients):SystenClients
/** * * @类名称:SystenClients * @类描述:客户角色(Clients) * @创建人:zender */ public class SystenClients { public static void main(String[] args) { // 由于Facade的作用,客户端可以根本不知道子系统类的存在 SystemFacade sf = new SystemFacade(); sf.doABC(); System.out.println("...................."); sf.doAB(); } }
结果:
三、优点缺点
1,优点
Facade模式降低了客户端对子系统使用的复杂性。
外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
通过合理使用Facade,可以帮助我们更好的划分访问的层次。
2,缺点
过多的或者是不太合理的Facade也容易让人迷惑,到底是调用Facade好呢,还是直接调用模块好。
四,适用场景
1,需要将设计进行分层时考虑Facade模式。
2,在开发阶段,子系统往往因为重构变得越来越复杂,增加外观模式可以提供一个简单的接口,减少它们之间的依赖。
3,在维护一个遗留的大型系统时,可以这个系统已经非常难以维护和扩展,可以为新系统开发一个Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。