外观模式:也叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式结构:
Facade:外观类,知道哪些子系统负责处理请求,将客户的请求代理给适当的子系统对象,关联多个子系统类。也就是需要知道所有子系统的方法和属性,进行组合,供客户端调用。
SubSystem Classes:子系统同类集合,实现子系统的功能,处理Facade对象指派的任务,需要注意的是:子类中没有Facade的任何信息,即没有对Facade对象的引用。
如果对结构理解不是很清晰,我们先来看一下结构的代码实现,看完这后再做进一步分析就能比较清楚的理解:
1、新建子系统类,在这里我们可以称之为单元功能类,因为完成的基本可以看做是单元功能,尽管他内部可以定义很多复杂的功能(即方法)。
package subsystem; /** * Created by Administrator on 2017/8/5. */ public class SubSystemOne { public void methodOne(){ System.out.println("子系统方法 1"); } }
package subsystem; /** * Created by Administrator on 2017/8/5. */ public class SubSystemTwo { public void methodTwo(){ System.out.println("子系统方法 2"); } }
package subsystem; /** * Created by Administrator on 2017/8/5. */ public class SubSystemThree { public void methodThree(){ System.out.println("子系统方法 3"); } }
package subsystem; /** * Created by Administrator on 2017/8/5. */ public class SubSystemFour { public void methodFour(){ System.out.println("子系统方法 4"); } }
2、定义Facade类:
package facade; import subsystem.SubSystemFour; import subsystem.SubSystemOne; import subsystem.SubSystemThree; import subsystem.SubSystemTwo; /** * Created by Administrator on 2017/8/5. */ public class Facade { /** * 关联多个子系统类 */ private SubSystemOne one; private SubSystemTwo two; private SubSystemThree three; private SubSystemFour four; /** * 在构造器中将子类属性实例化 */ public Facade(){ one = new SubSystemOne(); two = new SubSystemTwo(); three = new SubSystemThree(); four = new SubSystemFour(); } /** * 自由组合方法实现复杂功能 */ public void facadeMethodA(){ one.methodOne(); two.methodTwo(); } /** * 自由组合方法实现复杂功能 */ public void facadeMethodB(){ two.methodTwo(); three.methodThree(); four.methodFour(); } }
3、新建测试类:
import facade.Facade; import org.junit.Test; /** * Created by Administrator on 2017/8/5. */ public class TestFacade { @Test public void testFacadeMethod(){ Facade facade = new Facade(); facade.facadeMethodA(); System.out.println("---------------------------"); facade.facadeMethodB(); } }
从代码可以看出,外观模式体现的是依赖倒转原则和迪米特法则的思想。即客户端操作想要使用什么功能的时候,不需要自己在客户端手动的逐个创建添加单元功能来实现那个目的功能,只需要在Facade类中组装好,然后提供给客户端直接调用即可。进一步解释何为体现依赖倒转原则,就是我要实现什么功能,不需要依赖你这个单元功能SubSystem Classes,我直接找Facade要,他已经给我组装了。何为迪米特法则的体现,就是这种情况下客户端与单元功能之间的耦合非常低,但是客户端却想要使用单元功能类的功能,那么可以通过Facade这个第三者来协调完成调用。
外观模式使用场合:
首先,在设计初期阶段,应该要有意识的将不同的多个层分离,然后层与层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,是的耦合度大大降低;
其次,在开发阶段,子系统因为不断地重构演化而变得越来越复杂,大多数模式使用时也会产生很多很小的类,这本是好事,但是也给外部调用他们的用户程序带来了使用上的困难,增加Facade,可以提供一个简单的接口,减少他们之间的依赖;
第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须要依赖它,此时用外观模式Facade也是非常合适的,你可以为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade类与遗留代码交互所有的复杂工作。
嗯,外观模式理解之后,看起来是挺有用,更多内容呢就请查阅相关资料,本文的外观模式介绍到此就结束了。