外觀模式

前面介紹的適配器模式(設計模式讀書筆記-----適配器模式)講的是如何將一個接口轉換成客戶所須要的另外一個接java

口,它的目的在於解決接口的不兼容性問題。如今這裏有這樣一個模式,它的目的在於如何簡化接口,它能夠將多個設計模式

類的複雜的一切隱藏在背後,只顯露出一個乾淨美觀的外觀。this

         

         晚上睡覺以前,你老是喜歡看電視,在你進入臥室的時候你須要完成如下幾個步驟:打開電燈、打開空調、放spa

心銀幕(假如你家有)、打開電視經過這麼些繁瑣的步驟後你終於能夠看電視了,可是你要睡覺了呢?又要去進行繁瑣.net

的關閉動做。這裏你就須要一個外觀模式了,經過實現一個更加合理的接口外觀類將這些動做都包裝起來,實現一設計

鍵「看電視」、一鍵「關電視」。這就是外觀模式的動機orm


         1、模式定義對象

         所謂外觀模式就是提供一個統一的接口,用來訪問子系統中的一羣接口。blog

         外觀模式定義了一個高層接口,讓子系統更容易使用。以下圖,是使用外觀模式後將子系統的使用變得更加簡單。接口

         在引入外觀模式後,客戶只須要與外觀角色打交道,客戶與子系統的複雜關係有外觀角色來實現,從而下降了

系統的耦合度。


         2、模式結構



         外觀模式包含以下兩個角色:

            Facade: 外觀角色

            SubSystem:子系統角色

 

       3、模式實現

         場景就是上面那個「睡覺看電視」的場景。

實例的UML圖


首先是四個組件(電視、電燈、空調、銀幕)

[java] view plaincopyprint?

  1. public class Television {  

  2.     public void on(){  

  3.         System.out.println("打開了電視....");  

  4.     }  

  5.       

  6.     public void off(){  

  7.         System.out.println("關閉了電視....");  

  8.     }  

  9. }  


[java] view plaincopyprint?

  1. public class Light {  

  2.     public void on(){  

  3.         System.out.println("打開了電燈....");  

  4.     }  

  5.       

  6.     public void off(){  

  7.         System.out.println("關閉了電燈....");  

  8.     }  

  9. }  


[java] view plaincopyprint?

  1. public class AirCondition {  

  2.     public void on(){  

  3.         System.out.println("打開了空調....");  

  4.     }  

  5.       

  6.     public void off(){  

  7.         System.out.println("關閉了空調....");  

  8.     }  

  9. }  


[java] view plaincopyprint?

  1. public class Screen {  

  2.     public void up(){  

  3.         System.out.println("升起銀幕....");  

  4.     }  

  5.       

  6.     public void down(){  

  7.         System.out.println("降低銀幕....");       

  8.     }  

  9. }  


而後是比較強大、乾淨、美觀的外觀

[java] view plaincopyprint?

  1. public class WatchTvSwtichFacade {  

  2.     Light light;  

  3.     AirCondition ac;  

  4.     Television tv;  

  5.     Screen screen;  

  6.       

  7.     public WatchTvSwtichFacade(Light light,AirCondition ac,Television tv,Screen screen){  

  8.         this.light = light;  

  9.         this.ac = ac;  

  10.         this.tv = tv;  

  11.         this.screen = screen;  

  12.     }  

  13.       

  14.     public void on(){  

  15.         light.on();       //首先開燈  

  16.         ac.on();          //而後是打開空調  

  17.         screen.down();    //把銀幕降下來  

  18.         tv.on();          //最後是打開電視  

  19.     }  

  20.       

  21.     public void off(){  

  22.         tv.off();         //首先關閉電視機  

  23.         screen.up();      //銀幕升上去  

  24.         ac.off();         //空調關閉  

  25.         light.off();      //最後關燈  

  26.     }  

  27. }  


客戶端

[java] view plaincopyprint?

  1. public class Client {  

  2.     public static void main(String[] args) {  

  3.         //實例化組件  

  4.         Light light = new Light();  

  5.         Television tv = new Television();  

  6.         AirCondition ac = new AirCondition();  

  7.         Screen screen = new Screen();  

  8.           

  9.         WatchTvSwtichFacade watchTv = new WatchTvSwtichFacade(light, ac, tv, screen);  

  10.           

  11.         watchTv.on();  

  12.         System.out.println("--------------能夠看電視了.........");  

  13.         watchTv.off();  

  14.         System.out.println("--------------能夠睡覺了...........");  

  15.     }  

  16. }  


運行結果


從上面的使用經過使用外觀模式,客戶能夠很是方便的實現比較複雜的功能。


4、模式優缺點

 優勢

 一、引入外觀模式,是客戶對子系統的使用變得簡單了,減小了與子系統的關聯對象,實現了子系統與客戶之間

的鬆耦合關係。

 二、只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類

 三、下降了大型軟件系統中的編譯依賴性,並簡化了系統在不一樣平臺之間的移植過程

  缺點

   一、不能很好地限制客戶使用子系統類,若是對客戶訪問子系統類作太多的限制則減小了可變性和靈活性

   二、在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」


 5、使用場景

   一、當要爲一個複雜子系統提供一個簡單接口時能夠使用外觀模式。

   二、客戶程序與多個子系統之間存在很大的依賴性。引入外觀類將子系統與客戶以及其餘子系統解耦,能夠提

高子系統的獨立性和可移植性


   6、模式總結

   一、  外觀模式的主要優勢就在於減小了客戶與子系統之間的關聯對象,使用客戶對子系統的使用變得簡單了,

也實現了客戶與子系統之間的鬆耦合關係。它的缺點就在於違背了「開閉原則」。

   二、  若是須要實現一個外觀模式,須要將子系統組合進外觀中,而後將工做委託給子系統執行。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息