系统与其余外部系统交互,有时候操做比较复杂,须要一个防腐层来加强本系统与其余系统的耦合性,对本系统封装一些对外操做的细节,达到简化的目的。java
符合最少知识原则,即Least Knowledge Principle,也成为迪米特原则,Law of Demeter。this
为子系统中的一组接口提供一个一直的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。spa
(1)界面:从一个组件外部来看这个组件,可以看到什么,就是这个组件的界面,即外观。code
好比,你从一个类的外部来看这个类,那么这个类的public方法就是这个类的外观;orm
好比,你从一个模块外部来看这个模块,那么这个模块对外的接口就是这个模块的外观。对象
(2)接口:外部和内部交互的一个通道,一般是指一些方法,能够是类方法,也能够是interface方法接口
一、系统对外部系统调用的Facade,内部系统只依赖于Facade的方法,其里头再调用外部接口,达到防腐的目的,也达到了屏蔽一些外部接口的调用细节,好比封装异常,分步调用等ip
二、EJB的Session Facade,对客户端屏蔽了远程调用操做,减小客户端与服务对象之间的依赖程度,把底层服务对象的接口和它们之间的复杂依赖交互经过Facade隐藏起来。ci
外观模式的目的不是给子系统添加新的功能接口,而是为了让外部减小与子系统内部多个模块的交互,松散耦合,从而让外部可以更简单地使用子系统。it
可是外观模式不阻止客户端直接调用子模块的功能,它只是提供了一个缺省的功能实现。对外屏蔽子系统: 若是把Facade实现成为接口,还附带一个功能,就是可以有选择性地暴露接口的方法,尽可能减小模块对子系统外提供的接口方法。
/** * A模块 */ public interface AModuleApi { /** * 示意方法,A模块对外的一个功能方法 */ public void testA(); } public class AModuleImpl implements AModuleApi{ public void testA() { System.out.println("如今在A模块里面操做testA方法"); } } /** * B模块 */ public interface BModuleApi { public void testB(); } public class BModuleImpl implements BModuleApi{ public void testB() { System.out.println("如今在B模块里面操做testB方法"); } } /** * C模块 */ public interface CModuleApi { public void testC(); } public class CModuleImpl implements CModuleApi{ public void testC() { System.out.println("如今在C模块里面操做testC方法"); } }
public class Facade { //被委托的对象 private ClassA a = new ClassA(); private ClassB b = new ClassB(); private ClassC c = new ClassC(); //提供给外部访问的方法 public void methodA(){ this.a.doSomethingA(); } public void methodB(){ this.b.doSomethingB(); } public void methodC(){ this.c.doSomethingC(); } }
public class Client { public static void main(String[] args) { // //不用Facade,须要本身跟多个模块交互 // AModuleApi a = new AModuleImpl(); // a.testA(); // BModuleApi b = new BModuleImpl(); // b.testB(); // CModuleApi c = new CModuleImpl(); // c.testC(); // // System.out.println("使用Facade----------------------〉"); //使用了Facade new Facade().test(); } }