<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      川山甲

      追求內(nèi)心的非常平靜!瞬間清空所有的雜念,達(dá)到物我兩忘!

        博客園  :: 首頁(yè)  ::  :: 聯(lián)系 :: 訂閱 訂閱  :: 管理
      介紹
      裝飾者模式動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。
       
      思維導(dǎo)圖

      裝飾者模式

       

      有這樣一個(gè)項(xiàng)目,做一個(gè)餐廳訂餐系統(tǒng)。起初的代碼結(jié)構(gòu)是這樣的。前面有很多Beverage的繼承類,現(xiàn)在遇到的問題是牛奶的價(jià)錢上漲了,那么所有相關(guān)的類,我們都要進(jìn)行調(diào)整,比如Milk,SugarAndMilk類,這種類還有很多,我們需要逐個(gè)去修改類中的方法——開發(fā)人員每次都做這種事情,要瘋了!所以我們要改變現(xiàn)有的結(jié)構(gòu)。以下的圖都是簡(jiǎn)圖,實(shí)際的圖,可沒有這么簡(jiǎn)單。

       

       

       設(shè)計(jì)問題:

      1》類數(shù)量爆炸,有很多類,難以維護(hù);

      2》整個(gè)設(shè)計(jì)呆板;

      3》基類加入的新功能無(wú)法使用于子類;

       

      復(fù)用類方法的方式很多,比如繼承,組合,委托。為什么老是習(xí)慣用繼承呢?我看Zend Framework也有這種習(xí)慣!每次找對(duì)應(yīng)方法,一直往上翻。——題外話!!!!

       

       后來(lái)經(jīng)過小組研究決定,我們決定把基礎(chǔ)類抽出來(lái),比如,我們把咖啡做成一個(gè)單獨(dú)的類,其他的咖啡,比如牛奶咖啡,甜味咖啡,我們只對(duì)材料單獨(dú)包裝成一個(gè)類。

      經(jīng)過改良的設(shè)計(jì):

       

      詳解

      1》對(duì)于飲品,我們直接繼承Beverage類,直接把報(bào)價(jià)寫進(jìn)飲品類里面;

      2》而對(duì)于一些需要添加調(diào)味品的特殊飲品,我們做累加操作。比如,我想要杯奶咖啡,則 總價(jià)=咖啡價(jià)+奶價(jià)

      3》這樣不同的飲料就很容易知道它的價(jià)格。

       

      代碼
       
      <?php
      abstract class Beverage{
          public $_name;
          abstract public function Cost();
      }
      // 被裝飾者類
      class Coffee extends Beverage{
          public function __construct(){
              $this->_name = 'Coffee';
          }   
          public function Cost(){
              return 1.00;
          }   
      }
      // 以下三個(gè)類是裝飾者相關(guān)類
      class CondimentDecorator extends Beverage{
          public function __construct(){
              $this->_name = 'Condiment';
          }   
          public function Cost(){
              return 0.1;
          }   
      }
      
      class Milk extends CondimentDecorator{
          public $_beverage;
          public function __construct($beverage){
              $this->_name = 'Milk';
              if($beverage instanceof Beverage){
                  $this->_beverage = $beverage;
              }else
                  exit('Failure');
          }   
          public function Cost(){
              return $this->_beverage->Cost() + 0.2;
          }   
      }
      
      class Sugar extends CondimentDecorator{
          public $_beverage;
          public function __construct($beverage){
              $this->_name = 'Sugar';
              if($beverage instanceof Beverage){
                  $this->_beverage = $beverage;
              }else{
                  exit('Failure');
              }
          }
          public function Cost(){
              return $this->_beverage->Cost() + 0.2;
          }
      }
      
      // Test Case
      //1.拿杯咖啡
      $coffee = new Coffee();
      
      //2.加點(diǎn)牛奶
      $coffee = new Milk($coffee);
      
      //3.加點(diǎn)糖
      $coffee = new Sugar($coffee);
      
      printf("Coffee Total:%0.2f元\n",$coffee->Cost());
      

       

       
      總結(jié)
       
      1.裝飾者(Milk)和被裝飾者(Coffee)必須是一樣的類型。目的是裝飾者必須取代被裝飾者。
      2.添加行為:當(dāng)裝飾者和組件組合時(shí),就是在加入新的行為。
       
      題外話:
      1.利用繼承設(shè)計(jì)子類行為,是在編譯時(shí)靜態(tài)決定的,而且所有的子類都會(huì)繼承到相同的行為。打個(gè)比方,老子想學(xué)點(diǎn)功夫,看你小子會(huì)太極拳,老子只需要繼承你一下 ,老子也就會(huì)太極拳了——呵呵,這時(shí)老子就變成你兒子了,看來(lái)繼承是要付出代價(jià)的。
       
      2.組合,我們可以擴(kuò)展對(duì)象的行為,在運(yùn)行時(shí)動(dòng)態(tài)地進(jìn)行擴(kuò)展。利用組合我們可以隨時(shí)把我們當(dāng)時(shí)設(shè)計(jì)超類時(shí)沒有想到的方法加入到對(duì)象中,而不用改變現(xiàn)有的代碼。打個(gè)比方,老子現(xiàn)在沒有內(nèi)力,吸功大法,把和尚,尼姑,道士的內(nèi)力(行為對(duì)象)都吸過來(lái),那在搏斗(運(yùn)行時(shí))中,老子可以隨時(shí)都能使用不同的內(nèi)力,但也不能胡亂吸內(nèi)力,否則你就要走火入魔了!
       
      3.類應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。如果我們每個(gè)部分都用裝飾者模式進(jìn)行設(shè)計(jì),那么對(duì)于整個(gè)框架來(lái)說(shuō)有點(diǎn)浪費(fèi),而且你也加大了代碼的難度。那什么時(shí)候使用這種模式呢?我們一般用于經(jīng)常改變的地方。那我們又怎么知道哪些是經(jīng)常改變的地方呢?這個(gè)就需要我們的經(jīng)驗(yàn)和你對(duì)所處行業(yè)的了解。建議大家平時(shí)多看點(diǎn)例子。
       
      4.裝飾模式為設(shè)計(jì)注入彈性,但同時(shí)會(huì)在設(shè)計(jì)中加入大量的小類,這偶爾會(huì)導(dǎo)致別人不容易了解這種設(shè)計(jì)。
       
      5.在使用裝飾者模式的時(shí)候,對(duì)插入的的裝飾者要特別小心。因?yàn)檠b飾者模式依賴某種特定的類型(Beverage)。
       
      6.要想很好的使用裝飾者模式,我們還要配合使用工廠模式和生成器模式,但今天只說(shuō)裝飾者模式。要想知道更多,請(qǐng)聽下回分解。
       

       

      參考文獻(xiàn):《head first 設(shè)計(jì)模式》
       
      posted on 2012-02-28 16:00  川山甲  閱讀(11116)  評(píng)論(5)    收藏  舉報(bào)
      主站蜘蛛池模板: 公喝错春药让我高潮| 亚洲一卡2卡三卡四卡精品| 内射干少妇亚洲69XXX| 亚洲精品一品二品av| 国产区二区三区在线观看| 亚洲精品欧美综合二区| 亚洲国产成人久久综合区| 久久婷婷综合色一区二区| 精品一区二区中文字幕| 久久欧洲精品成av人片| 欧美拍拍视频免费大全| 免费99视频| 久久精品国产亚洲夜色av| a级亚洲片精品久久久久久久| 天堂资源在线| 国产又爽又黄的激情视频| 女人香蕉久久毛毛片精品| 国产亚洲精品久久久久秋霞| 亚洲码亚洲码天堂码三区| 欧美成人免费一区二区三区视频 | 成人免费毛片aaaaaa片| 亚洲精品人妻中文字幕| 中文字幕国产精品综合| 99精品国产高清一区二区麻豆 | 在线观看热码亚洲av每日更新| 自拍偷自拍亚洲精品播放| 国产精品乱人伦一区二区| 欧美视频网站www色| 精品国产精品中文字幕| 国产一区二区亚洲一区二区三区 | 麻豆精品久久精品色综合| 99re在线视频观看| 亚洲中文字幕日产无码成人片| 久久亚洲精品11p| 国产不卡一区不卡二区| 野花社区视频www官网| 亚洲成色在线综合网站| 亚洲综合成人一区二区三区| 四虎永久免费很黄的视频| 四虎在线播放亚洲成人| 一本色道久久加勒比综合|