【08】結構型-外觀Facade模式

1、上下文及問題

一、基本原則

     系統與其餘外部系統交互,有時候操做比較複雜,須要一個防腐層來加強本系統與其餘系統的耦合性,對本系統封裝一些對外操做的細節,達到簡化的目的。java

     符合最少知識原則,即Least Knowledge Principle,也成爲迪米特原則,Law of Demeter。this


二、定義

爲子系統中的一組接口提供一個一直的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。spa

(1)界面:從一個組件外部來看這個組件,可以看到什麼,就是這個組件的界面,即外觀。code

好比,你從一個類的外部來看這個類,那麼這個類的public方法就是這個類的外觀;orm

好比,你從一個模塊外部來看這個模塊,那麼這個模塊對外的接口就是這個模塊的外觀。對象

(2)接口:外部和內部交互的一個通道,一般是指一些方法,能夠是類方法,也能夠是interface方法接口


2、常見場景

一、系統對外部系統調用的Facade,內部系統只依賴於Facade的方法,其裏頭再調用外部接口,達到防腐的目的,也達到了屏蔽一些外部接口的調用細節,好比封裝異常,分步調用等ip

二、EJB的Session Facade,對客戶端屏蔽了遠程調用操做,減小客戶端與服務對象之間的依賴程度,把底層服務對象的接口和它們之間的複雜依賴交互經過Facade隱藏起來。ci


3、解決方法

      外觀模式的目的不是給子系統添加新的功能接口,而是爲了讓外部減小與子系統內部多個模塊的交互,鬆散耦合,從而讓外部可以更簡單地使用子系統。it

      可是外觀模式不阻止客戶端直接調用子模塊的功能,它只是提供了一個缺省的功能實現。對外屏蔽子系統: 若是把Facade實現成爲接口,還附帶一個功能,就是可以有選擇性地暴露接口的方法,儘可能減小模塊對子系統外提供的接口方法。


4、抽象模型

5、代碼實例 

一、模塊

/**
* 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方法");
    }

}


二、Facade

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();
    }
}


三、Client

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();        
    }
}
相關文章
相關標籤/搜索