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

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

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

      川山甲

      追求內心的非常平靜!瞬間清空所有的雜念,達到物我兩忘!

        博客園  :: 首頁  ::  :: 聯系 :: 訂閱 訂閱  :: 管理
      介紹
      策略模式:定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。
       
      封裝:把行為用接口封裝起來,我們可以把那些經常變化的部分,從當前的類中單獨取出來,用接口進行單獨的封裝。
      互相替換:我們封裝好了接口,通過指定不同的接口實現類進行算法的變化。
       
      思維導圖

      php策略模式-鴨子游戲

      我來解釋下這個思維導圖的過程:
      1.Joe做了一套相當成功的模擬鴨子的游戲。設計了一個超類Duck,然后讓各種鴨子繼承這個類。
       
      2.后來客戶提出要讓鴨子有飛的能力。所以Joe就在超類中加了個fly()方法,這樣下面的子類都有飛行的行為。
         問題來了:1>原來Duck的子類中竟然有橡皮鴨,橡皮鴨是不會飛的。——Joe用重載的方式,把橡皮鴨的fly()方法設置為空.
                           2>覆蓋fly(),我們看到了橡皮鴨的fly()里,沒有任何代碼,如果以后我們再添加別的不會飛的鴨子,那我么還要這么處理嗎?——那么代碼重復了!
       
      3.上面2的方式我們知道是有問題的,所以Joe想到把Duck做成接口,這樣每個子類必須實現Duck里的方法。這樣就保證每個鴨子都能根據自己的需要添加行為。
           問題來了:產品經常處于更新中,規格也在不斷的變化。導致每當有新鴨子的時候,Joe就要被迫檢查一遍子類是否覆蓋了fly()方法。——當你修改某個行為的時候,你必須得往下追蹤并在每一個定義此行為的類中修改它。
       
      4.綜合以上問題,Joe想到了把那些變化的部分從不變化的位置中抽出來。比如,我們對fly()行為,做了單獨的接口FlyBehavior。如果鴨子想要飛行功能的時候,我們就讓鴨子實現FlyBehavior.
       
      5.深造:我們想讓鴨子有不同的飛行功能,讓它在運行時候做不同的飛行動作。讓鴨子類實現接口,只能讓鴨子有一種行為。
      所以Joe,想到用組合的防止,當鴨子需要其他飛行功能要求的時候,我們可以用setBehavior()方式,指定性的飛行方式。
       
      代碼
      <?php
      interface FlyBehavior{
          public function fly();
      }
      
      class FlyWithWings implements FlyBehavior{
          public function fly(){
              echo "Fly With Wings \n";
          }
      }
      
      class FlyWithNo implements FlyBehavior{
          public function fly(){
              echo "Fly With No Wings \n";
          }
      }
      
      class Duck{
          private $_flyBehavior;
          public function performFly(){
              $this->_flyBehavior->fly();
          }
      
          public function setFlyBehavior(FlyBehavior $behavior){
              $this->_flyBehavior = $behavior;
          }
      }
      
      class RubberDuck extends Duck{
      }
      // Test Case
      $duck = new RubberDuck();
      
      /*  想讓鴨子用翅膀飛行 */
      $duck->setFlyBehavior(new FlyWithWings());
      $duck->performFly();            
      
      /*  想讓鴨子不用翅膀飛行 */
      $duck->setFlyBehavior(new FlyWithNo());
      $duck->performFly();
      

       

      總結
      總的來說,我們在開發中的設計原則如下:
      1.找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起;
      2.針對接口編程,不針對實現編程;
      3.多用組合,少用繼承;
       
      參考文獻: 《head first 設計模式》
      posted on 2012-02-27 16:25  川山甲  閱讀(13544)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 性一交一乱一乱一视频| 91热在线精品国产一区| 济源市| 国产精品伦人一久二久三久| 免费观看欧美猛交视频黑人| 色综合人人超人人超级国碰| 四会市| 亚洲中文字幕无码中字| 国产精品人妻中文字幕| 深夜av在线免费观看| 亚洲理论在线A中文字幕| 婷婷久久香蕉五月综合加勒比| 日韩av中文字幕有码| 亚洲一区二区三区18禁| 亚洲国产女性内射第一区| ww污污污网站在线看com| 小嫩批日出水无码视频免费 | 中文字幕亚洲人妻系列| 国产又大又粗又爽的毛片| 一区二区三区日本久久九| 在熟睡夫面前侵犯我在线播放| 日韩不卡二区三区三区四区| 柘城县| 特级做a爰片毛片免费看无码| 日韩中文字幕国产精品| 日本福利一区二区精品| 欧美成人精品三级网站视频| 亚洲人亚洲人成电影网站色| 熟妇的味道hd中文字幕| 国产亚洲精品久久久久久大师 | 亚洲精品日韩中文字幕| 韩国无码av片在线观看| 久久理论片午夜琪琪电影网| 亚洲综合久久精品国产高清| 日本精品网| 国产免费网站看v片元遮挡| 91色老久久精品偷偷性色| 成人嫩草研究院久久久精品| 国内精品久久久久影院薰衣草| 99在线精品视频观看免费| 亚洲综合小说另类图片五月天|