PHP設計模式之策略模式

來源:互聯網
上載者:User

標籤:規格   with   form   ext   自己   interface   添加   針對   his   

介紹策略模式:定義了演算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。 封裝:把行為用介面封裝起來,我們可以把那些經常變化的部分,從當前的類中單獨取出來,用介面進行單獨的封裝。互相替換:我們封裝好了介面,通過指定不同的介面實作類別進行演算法的變化。 思維導圖

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()方式,指定性的飛行方式。 代碼<?phpinterface 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.多用組合,少用繼承;

 

PHP設計模式之策略模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.