系統與其餘外部系統交互,有時候操做比較複雜,須要一個防腐層來加強本系統與其餘系統的耦合性,對本系統封裝一些對外操做的細節,達到簡化的目的。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(); } }