posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Facade模式

          Posted on 2007-10-15 21:26 ZelluX 閱讀(450) 評(píng)論(0)  編輯  收藏

          這兩星期里得看懂Robocode代碼,然后自己做個(gè)類似小霸王坦克大戰(zhàn)的游戲出來@@ 只能老老實(shí)實(shí)啃了

          首先要了解了一些常用的設(shè)計(jì)模式,由于時(shí)間有限,就不去看四人幫的那本書了,偷懶g(shù)oogle別人的文章快速入門算了

          Robocode中有不少M(fèi)anager類,其實(shí)就是Façade模式的應(yīng)用。

          http://www.fish888.com/Facade-t126336


          1、官方描述:

              為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,Facade模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。

             

          2、實(shí)例討論:

          我們可以通過電視機(jī)遙控器的作用來理解該模式的價(jià)值和作用,電視機(jī)的內(nèi)部很復(fù)雜,包括頻道調(diào)節(jié)和處理系統(tǒng)、圖像色彩調(diào)節(jié)處理系統(tǒng)、聲音調(diào)節(jié)系統(tǒng)等等,每個(gè)系統(tǒng)又包括多個(gè)類進(jìn)行操作,如果把這些系統(tǒng)都暴露給用戶使用,而不是通過遙控器進(jìn)行封裝,那么每個(gè)電視機(jī)用戶都可能需要進(jìn)行一個(gè)《電視機(jī)操作使用》培訓(xùn)才能使用了。相對(duì)而言,現(xiàn)在通過遙控器,電視機(jī)用戶在很短的時(shí)間就可以掌握常規(guī)的使用方法。
          電視機(jī)遙控器及電視機(jī)內(nèi)部的結(jié)構(gòu)圖如下所示:

           

           3、適用性:
          1
          )為復(fù)雜的子系統(tǒng)提供一個(gè)簡(jiǎn)單的接口,子系統(tǒng)可能為了通用性目標(biāo),實(shí)現(xiàn)為可以根據(jù)使用情況進(jìn)行各種定制的復(fù)雜系統(tǒng),可是按照2/8法則,80%的用戶可能只是使用簡(jiǎn)單的20%的功能,這樣通過提供Facade對(duì)子系統(tǒng)進(jìn)行高層概括,便極大的簡(jiǎn)化了這80%用戶的易用性;
          2
          )子系統(tǒng)存在多種實(shí)現(xiàn),通過Facade在用戶和子系統(tǒng)內(nèi)部實(shí)現(xiàn)之間進(jìn)行分離,減弱了用戶對(duì)子系統(tǒng)的實(shí)現(xiàn)依賴性,這樣就便于對(duì)子系統(tǒng)進(jìn)行擴(kuò)展和維護(hù);
          3
          )降低子系統(tǒng)之間的依賴性;

             

          4、實(shí)現(xiàn)特征:
          1
          Facade不提供新的功能,僅作為子系統(tǒng)的高層概括和代理;
          2
          )子系統(tǒng)不知道Facade的存在,即子系統(tǒng)中沒有對(duì)Facade的關(guān)聯(lián),而只是Facade了解子系統(tǒng)內(nèi)部結(jié)構(gòu);
          3
          Facade原則上并不禁止用戶直接訪問子系統(tǒng)中的對(duì)象,Facade在子系統(tǒng)的可定制性上層建立了一個(gè)簡(jiǎn)單視圖;

           5Java代碼演示:
          下面代碼演示了電視機(jī)遙控器的程序結(jié)構(gòu):

           1)子系統(tǒng)部分代碼:
          ChannelManager(頻道管理器),負(fù)責(zé)電視頻道的相關(guān)調(diào)整和操作:

             

          package qinysong.pattern.facade.subsystem;

          public class ChannelManager ...{
            
            
          //當(dāng)前頻道編號(hào)
            private int currentChannelNumber;
            
            
          //設(shè)置頻道(可能還會(huì)調(diào)用其它輔助類)
            public void chooseChannel(int channelNumber) ...{
              System.out.println("ChannelManager.chooseChannel(): 
          設(shè)置頻道(可能還會(huì)調(diào)用其它輔助類)");
              currentChannelNumber = channelNumber;
            }
            
            
          //上調(diào)頻道(可能還會(huì)調(diào)用其它輔助類)
            public void upSkipChannel()...{
              System.out.println("ChannelManager.upSkipChannel(): 
          上調(diào)頻道(可能還會(huì)調(diào)用其它輔助類)");
              currentChannelNumber++;
            }
            
            
          //下調(diào)頻道(可能還會(huì)調(diào)用其它輔助類)
            public void downSkipChannel()...{
              System.out.println("ChannelManager.downSkipChannel(): 
          下調(diào)頻道(可能還會(huì)調(diào)用其它輔助類)");
              currentChannelNumber--;
            }
            
            
          public void otherMethod()...{
              System.out.println("ChannelManager.otherMethod(): 
          其他方法");
            }
          }

          AudioManager(聲頻管理器),負(fù)責(zé)聲音的相關(guān)調(diào)整和操作,該類還用到其他類,如類Volume等:

          package qinysong.pattern.facade.subsystem;

          public class AudioManager ...{
            
            
          //當(dāng)前音量
            private Volume currentVolume;

            
          //加重音量
            public void aggravateVolume()...{
              System.out.println("AudioManager.aggravateVolume(): 
          加重音量(可能還會(huì)調(diào)用其它輔助類)");
              currentVolume.aggravate();
            }

            
          //降低音量
            public void weakenVolume()...{
              System.out.println("AudioManager.weakenVolume(): 
          降低音量(可能還會(huì)調(diào)用其它輔助類)");
              currentVolume.weaken();
            }

            
          public void otherMethod()...{
              System.out.println("AudioManager.otherMethod(): 
          其他方法");
            }
          }

          ColorManager(色彩管理器),負(fù)責(zé)圖像色彩的相關(guān)調(diào)整和操作,該類還用到其他類,如類Color等:

          package qinysong.pattern.facade.subsystem;

          public class ColorManager ...{
            
            
          //當(dāng)前色彩度
            private Color currentColor;

            
          //加重色彩度
            public void aggravateColor()...{
              System.out.println("ColorManager.aggravateColor(): 
          加重色彩度(可能還會(huì)調(diào)用其它輔助類)");
              currentColor.aggravate();
            }

            
          //降低色彩度
            public void weakenColor()...{
              System.out.println("ColorManager.weakenColor(): 
          降低色彩度(可能還會(huì)調(diào)用其它輔助類)");
              currentColor.weaken();
            }

            
          public void otherMethod()...{
              System.out.println("ColorManager.otherMethod(): 
          其他方法");
            }
          }

          2)視圖代碼:
          RemoteDevice(遙控器),對(duì)電視機(jī)的日常使用操作進(jìn)行封裝,以便用戶使用:

          package qinysong.pattern.facade;

          import qinysong.pattern.facade.subsystem.AudioManager;
          import qinysong.pattern.facade.subsystem.ColorManager;
          import qinysong.pattern.facade.subsystem.ChannelManager;

          public class RemoteDevice ...{  
            
            
          private AudioManager audioManager;
            
          private ColorManager colorManager;
            
          private ChannelManager channelManager;
            
            
          //加重音量
            public void aggravateVolume()...{
              
          //取得 audioManager
              audioManager.aggravateVolume();
            }
            
          //降低音量
            public void weakenVolume()...{
              
          //取得 audioManager
              audioManager.weakenVolume();
            }
            
            
          //加重色彩度
            public void aggravateColor()...{
              
          //取得 colorManager
              colorManager.aggravateColor();
            }
            
          //降低色彩度
            public void weakenColor()...{
              
          //取得 colorManager
              colorManager.weakenColor();
            }
            
            
          //設(shè)置頻道(可能還會(huì)調(diào)用其它輔助類)
            public void chooseChannel(int channelNumber) ...{
              
          //取得 channelManager
              channelManager.chooseChannel(channelNumber);
            }

            
          //上調(diào)頻道(可能還會(huì)調(diào)用其它輔助類)
            public void upSkipChannel()...{
              
          //取得 channelManager
              channelManager.upSkipChannel();
            }

            
          //下調(diào)頻道(可能還會(huì)調(diào)用其它輔助類)
            public void downSkipChannel()...{
              
          //取得 channelManager
              channelManager.downSkipChannel();
            }
          }

             


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 苍溪县| 乌兰浩特市| 若尔盖县| 肥城市| 林周县| 朝阳区| 财经| 额敏县| 张家口市| 嫩江县| 手机| 清丰县| 天台县| 台江县| 邹平县| 彭泽县| 台南县| 新密市| 榆树市| 兴业县| 北票市| 曲阜市| 澜沧| 泉州市| 株洲县| 锦州市| 太和县| 武穴市| 工布江达县| 福建省| 淮阳县| 福泉市| 来宾市| 南丹县| 黄冈市| 依安县| 榆树市| 锡林郭勒盟| 辽阳县| 姚安县| 海门市|