23種設計模式以外觀模式

一、定義

經過引入一個外觀角色來簡化客戶端與子系統之間的交互,爲複雜的子系統調用提供一個統一的入口,下降子系統與客戶端的耦合度,且客戶端調用很是方便。又稱爲門面模式。bash

二、模式結構

外觀模式由兩部分組成:this

  • Facade(外觀角色):在客戶端調用它的方法,在外觀角色中能夠知道相關的(一個或者多個)子系統的功能和責任;在正常狀況下,它將全部從客戶端發來的請求委託到相關的子系統去,傳統給相應的子系統對象處理。
  • SubSystem(子系統角色):在軟件系統中能夠有一個或者多個子系統角色,每個子系統能夠不是一個單獨的類,而是一個類的集合,它實現子系統的功能;每個子系統均可以被客戶端直接調用,或者被外觀角色調用,它處理由外觀類傳過來的請求;子系統並不知道外觀的存在,對於子系統而言,外觀角色僅僅是另一個客戶端而已。

三、實例

3.1 電器類(子系統角色)spa

public class Light {
    
    public void on() {
        System.out.println("打開燈...");
    }
    
    public void off() {
        System.out.println("關閉燈...");
    }
}
複製代碼
public class TV {
    
    public void on() {
        System.out.println("打開電視...");
    }
    
    public void off() {
        System.out.println("關閉電視...");
    }
}
複製代碼
public class AirCondition {
    
    public void on() {
        System.out.println("打開空調...");
    }
    
    public void off() {
        System.out.println("關閉空調...");
    }
}
複製代碼

3.2 智能遙控器(外觀角色)設計

public class Facade {
    
    private Light light;
    private TV tv;
    private AirCondition airCondition;
    
    public Facade() {
        this.light = new Light();
        this.tv = new TV();
        this.airCondition = new AirCondition();
    }
    
    public void open() {
        light.on();
        tv.on();
        airCondition.on();
    }
    
    public void close() {
        tv.off();
        light.off();
    }
}
複製代碼

3.3 客戶端調用3d

public class Client {
    
    public static void main(String[] args) {
        AirCondition airCodition = new AirCondition();
        Facade facade = new Facade();
        
        System.out.println("----------下班回到家----------");
        facade.open();
        
        System.out.println("----------上牀睡覺----------");
        facade.close();
        
        System.out.println("----------早上起牀----------");
        airCodition.off();
    }
}
複製代碼

四、適用場景

  • 當要爲一個複雜子系統提供一個簡單接口時可使用外觀模式。該接口能夠知足大多數用戶的需求,並且用戶也能夠越過外觀類直接訪問子系統。
  • 客戶程序與多個子系統之間存在很大的依賴性。引入外觀類將子系統與客戶以及其餘子系統解耦,能夠提升子系統的獨立性和可移植性。
  • 在層次化結構中,可使用外觀模式定義系統中每一層的入口,層與層之間不直接產生聯繫,而經過外觀類創建聯繫,下降層之間的耦合度。
  • 當維護一個遺留的大型系統時,可能這個系統已經很是難以維護和拓展但由於它含有重要的功能,新的需求必須依賴於它,則可使用外觀類,來爲設計粗糙或者複雜的遺留代碼提供一個簡單的接口,讓新系統和外觀類交互,而外觀類負責與遺留的代碼進行交互。

五、在MyBatis中的應用

六、優缺點

6.1 優勢
  • 對客戶端屏蔽子系統組件,減小了客戶處理的對象數目並使用子系統使用起來更加容易。經過引入外觀模式,客戶代碼將變得很簡單,與之關聯的對象也不多。
  • 實現了子系統與客戶之間的鬆耦合關係,這使得子系統的組件變化不會影響到調用它的客戶類,只須要調整外觀類便可。
  • 下降了大型軟件系統中的編譯依賴性,並簡化了系統在不一樣平臺之間的移植過程,由於編譯一個子系統通常不須要編譯全部其餘的子系統,一個子系統的修改對其餘子系統沒有任何影響,並且子系統內部變化也不會影響到外觀對象。
  • 只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類。
6.2 缺點
  • 不能很好地限制客戶使用子系統類,若是對客戶訪問子系統類作太多的限制則減小了可變性和靈活性。
  • 在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」。

特別聲明:一、如若文中有錯之處,歡迎大神指出。 二、文章是參考網上一些大神的文章,本身整理出來的,如如有侵權,可聯繫我刪除。 code

相關文章
相關標籤/搜索