前面介紹的適配器模式(設計模式讀書筆記-----適配器模式)講的是如何將一個接口轉換成客戶所須要的另外一個接java
口,它的目的在於解決接口的不兼容性問題。如今這裏有這樣一個模式,它的目的在於如何簡化接口,它能夠將多個設計模式
類的複雜的一切隱藏在背後,只顯露出一個乾淨美觀的外觀。this
晚上睡覺以前,你老是喜歡看電視,在你進入臥室的時候你須要完成如下幾個步驟:打開電燈、打開空調、放spa
心銀幕(假如你家有)、打開電視經過這麼些繁瑣的步驟後你終於能夠看電視了,可是你要睡覺了呢?又要去進行繁瑣.net
的關閉動做。這裏你就須要一個外觀模式了,經過實現一個更加合理的接口外觀類將這些動做都包裝起來,實現一設計
鍵「看電視」、一鍵「關電視」。這就是外觀模式的動機orm
1、模式定義對象
所謂外觀模式就是提供一個統一的接口,用來訪問子系統中的一羣接口。blog
外觀模式定義了一個高層接口,讓子系統更容易使用。以下圖,是使用外觀模式後將子系統的使用變得更加簡單。接口
在引入外觀模式後,客戶只須要與外觀角色打交道,客戶與子系統的複雜關係有外觀角色來實現,從而下降了
系統的耦合度。
2、模式結構
外觀模式包含以下兩個角色:
Facade: 外觀角色
SubSystem:子系統角色
3、模式實現
場景就是上面那個「睡覺看電視」的場景。
實例的UML圖
首先是四個組件(電視、電燈、空調、銀幕)
[java] view plaincopyprint?
public class Television {
public void on(){
System.out.println("打開了電視....");
}
public void off(){
System.out.println("關閉了電視....");
}
}
[java] view plaincopyprint?
public class Light {
public void on(){
System.out.println("打開了電燈....");
}
public void off(){
System.out.println("關閉了電燈....");
}
}
[java] view plaincopyprint?
public class AirCondition {
public void on(){
System.out.println("打開了空調....");
}
public void off(){
System.out.println("關閉了空調....");
}
}
[java] view plaincopyprint?
public class Screen {
public void up(){
System.out.println("升起銀幕....");
}
public void down(){
System.out.println("降低銀幕....");
}
}
而後是比較強大、乾淨、美觀的外觀
[java] view plaincopyprint?
public class WatchTvSwtichFacade {
Light light;
AirCondition ac;
Television tv;
Screen screen;
public WatchTvSwtichFacade(Light light,AirCondition ac,Television tv,Screen screen){
this.light = light;
this.ac = ac;
this.tv = tv;
this.screen = screen;
}
public void on(){
light.on(); //首先開燈
ac.on(); //而後是打開空調
screen.down(); //把銀幕降下來
tv.on(); //最後是打開電視
}
public void off(){
tv.off(); //首先關閉電視機
screen.up(); //銀幕升上去
ac.off(); //空調關閉
light.off(); //最後關燈
}
}
客戶端
[java] view plaincopyprint?
public class Client {
public static void main(String[] args) {
//實例化組件
Light light = new Light();
Television tv = new Television();
AirCondition ac = new AirCondition();
Screen screen = new Screen();
WatchTvSwtichFacade watchTv = new WatchTvSwtichFacade(light, ac, tv, screen);
watchTv.on();
System.out.println("--------------能夠看電視了.........");
watchTv.off();
System.out.println("--------------能夠睡覺了...........");
}
}
運行結果
從上面的使用經過使用外觀模式,客戶能夠很是方便的實現比較複雜的功能。
4、模式優缺點
優勢
一、引入外觀模式,是客戶對子系統的使用變得簡單了,減小了與子系統的關聯對象,實現了子系統與客戶之間
的鬆耦合關係。
二、只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類
三、下降了大型軟件系統中的編譯依賴性,並簡化了系統在不一樣平臺之間的移植過程
缺點
一、不能很好地限制客戶使用子系統類,若是對客戶訪問子系統類作太多的限制則減小了可變性和靈活性
二、在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」
5、使用場景
一、當要爲一個複雜子系統提供一個簡單接口時能夠使用外觀模式。
二、客戶程序與多個子系統之間存在很大的依賴性。引入外觀類將子系統與客戶以及其餘子系統解耦,能夠提
高子系統的獨立性和可移植性
6、模式總結
一、 外觀模式的主要優勢就在於減小了客戶與子系統之間的關聯對象,使用客戶對子系統的使用變得簡單了,
也實現了客戶與子系統之間的鬆耦合關係。它的缺點就在於違背了「開閉原則」。
二、 若是須要實現一個外觀模式,須要將子系統組合進外觀中,而後將工做委託給子系統執行。