合工大很牛很牛牛

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            14 Posts :: 1 Stories :: 37 Comments :: 0 Trackbacks
          假設家里有一組家庭影院,包括:燈光,幻燈屏幕,揚聲器,DVD。如果我們想打開這些設備開始看電影,必須先進行如下操作:

          關燈——放下屏幕——打開揚聲器——打開DVD

          實現如下:

          package javaapplication35;

           

          public class Main {

              public static void main(String[] args) {

                  Light light=new Light();

                  light.turnOff();

                 

                  Screen screen=new Screen();

                  screen.down();

                 

                  Amplifier amplifier=new Amplifier();

                  amplifier.On();

                 

                  Dvdplayer player=new Dvdplayer();

                  player.On();

              }

          }

           

          class Light {

              public void turnOn() {

                  System.out.println("Lights Turn On");

              }

              public void turnOff() {

                  System.out.println("Lights Turn Off");

              }

          }

           

          class Screen {

              public void down() {

                  System.out.println("Put the Screen Down");

              }

              public void up() {

                  System.out.println("Put the Screen Up");

              }

          }

           

          class Amplifier {

              public void On() {

                  System.out.println("Turn Sound Amplifier On");

              }

              public void Off() {

                  System.out.println("Turn Sound Amplifier Off");

              }

          }

           

          class Dvdplayer {

              public void On() {

                  System.out.println("Turn the DVD player On");

              }

              public void Off() {

                  System.out.println("Turn the DVD player Off");

              }

          }

           

          可以看到,想看部電影,在客戶端(主程序)要進行N多操作后才行。其實如果設備更多,比如說還要調整音頻屬性,切換DVD專屬頻道,打開空調等。每次我想看部電影,就要重復執行這些命令。

          可不可執行一次命令就可以搞定一切呢?很簡單,專門寫個類,寫個函數實現這一串命令就可以了。客戶端到時候就只要調用這個新增的類中的函數即可。

           

          把主函數的過程直接移去到另一個類的函數中:

          public class Main {

              public static void main(String[] args) {

                  (new TheaterFacade()).WatchDvd();

              }

          }

           

          class TheaterFacade {

              public void WatchDvd() {

                  Light light = new Light();

                  light.turnOff();

           

                  Screen screen = new Screen();

                  screen.down();

           

                  Amplifier amplifier = new Amplifier();

                  amplifier.On();

           

                  Dvdplayer player = new Dvdplayer();

                  player.On();

              }

          }

           

          這個就是最基本的Façade Pattern。前提條件是:當客戶端要實現某個功能的時候,必須要調用一連串的類及其函數。

          為了實現“一鍵”功能能,就在客戶端和眾多的類庫(實現具體過程)中間,添加一個Façade類,類中的方法實現了各種不同的“一鍵功能”(一鍵打開家庭影院,一鍵關閉。。。)

          這樣做還有一個好處就是隔離了客戶端和起具體實現作用的類庫。

           

          最后,上面的TheaterFacade類還可以寫的更靈活點,因為上面的程序把實例化LightScreen等放到了具體的方法內部,這樣當我想“關家庭影院”時,因為找不到具體對象就沒法操作了。

          把實例化放到具體方法外面,并添加一個構造函數,以便可以指定特定的播放儀器(比如家里有兩個揚聲器的時候?)

          package javaapplication35;

           

          public class Main {

              public static void main(String[] args) {

                  Light light = new Light();

                  Screen screen = new Screen();

                  Amplifier amplifier = new Amplifier();

                  Dvdplayer dvdplayer = new Dvdplayer();

                  TheaterFacade facade = new TheaterFacade(light, screen, amplifier, dvdplayer);

                  facade.WatchDvd();

                  facade.CloseDvd();

              }

          }

           

          class TheaterFacade {

              Light light;

              Screen screen;

              Amplifier amplifier;

              Dvdplayer dvdplayer;

              TheaterFacade(Light light, Screen screen, Amplifier amplifier, Dvdplayer dvdplayer) {

                  this.light = light;

                  this.screen = screen;

                  this.amplifier = amplifier;

                  this.dvdplayer = dvdplayer;

              }

              public void WatchDvd() {

                  light.turnOff();

                  screen.down();

                  amplifier.On();

                  dvdplayer.On();

              }

              public void CloseDvd() {

                  light.turnOn();

                  screen.up();

                  amplifier.Off();

                  dvdplayer.Off();

              }

          }

           

          class Light {

              public void turnOn() {

                  System.out.println("Lights Turn On");

              }

              public void turnOff() {

                  System.out.println("Lights Turn Off");

              }

          }

           

          class Screen {

              public void down() {

                  System.out.println("Put the Screen Down");

              }

              public void up() {

                  System.out.println("Put the Screen Up");

              }

          }

           

          class Amplifier {

              public void On() {

                  System.out.println("Turn Sound Amplifier On");

              }

              public void Off() {

                  System.out.println("Turn Sound Amplifier Off");

              }

          }

           

          class Dvdplayer {

              public void On() {

                  System.out.println("Turn the DVD player On");

              }

              public void Off() {

                  System.out.println("Turn the DVD player Off");

              }

          }

           

           

           

          posted on 2008-07-08 15:20 化的了 閱讀(1269) 評論(6)  編輯  收藏 所屬分類: 設計模式

          Feedback

          # re: Facade Pattern[未登錄] 2008-07-08 17:08 sea
          不是很同意樓主的見解  回復  更多評論
            

          # re: Facade Pattern 2008-07-08 19:02 化的了
          @sea
          很想聽聽

          是對這句話有意見嗎?
          當客戶端要實現某個功能的時候,必須要調用一連串的類及其函數。為了實現“一鍵”功能能,就在客戶端和眾多的類庫(實現具體過程)中間,添加一個Façade類,類中的方法實現了各種不同的“一鍵功能”  回復  更多評論
            

          # re: Facade Pattern 2008-07-08 20:45 si
          應該是不同意這個吧:上面的TheaterFacade類還可以寫的更靈活點。。。  回復  更多評論
            

          # re: Facade Pattern 2008-07-08 23:05 化的了
          @si
          中間那段程序只是思路的一個過程(一個中間思路,向Facade Pattern轉變的地方)
          最后的那段程序才是Facade pattern的實現。@si
            回復  更多評論
            

          # re: Facade Pattern 2008-07-09 19:23 leekiang
          能不能用幾句話描述清楚呢。或者例子再簡短點。寫得太多了,沒仔細看。  回復  更多評論
            

          # re: Facade Pattern 2008-07-09 22:26 化的了
          @leekiang
          書上六七十頁,我就寫了三四頁。。。已經夠提煉的了

          不過你說的也對,以后寫文章,描述的要更簡短清晰些,我也覺得自己寫的有點啰嗦  回復  更多評論
            

          主站蜘蛛池模板: 鄂伦春自治旗| 永仁县| 临湘市| 玉田县| 台江县| 珠海市| 凤翔县| 荥阳市| 宜昌市| 阿克苏市| 双辽市| 新巴尔虎右旗| 南岸区| 湘乡市| 湖南省| 衢州市| 九台市| 苏尼特右旗| 汪清县| 镇安县| 宾川县| 山东省| 九台市| 芒康县| 大庆市| 山阳县| 永新县| 习水县| 涞源县| 达州市| 康保县| 竹溪县| 嵩明县| 肥东县| 巴南区| 保靖县| 崇州市| 华容县| 渝中区| 乡城县| 施甸县|