主頁 > 知識庫 > PHP設計模式之策略模式(Strategy)入門與應用案例詳解

PHP設計模式之策略模式(Strategy)入門與應用案例詳解

熱門標簽:電銷機器人沒有效果怎么樣 天潤融通外呼系統(tǒng)好嗎 江西電銷機器人收費 泊頭在哪里辦理400電話 杭州語音電銷機器人 高德地圖標注店鋪收費嗎 欣思維地圖標注 江門回撥外呼系統(tǒng) 高德地圖標注位置怎么標注

本文實例講述了PHP設計模式之策略模式(Strategy)入門與應用。分享給大家供大家參考,具體如下:

這個策略模式,意思就是定義一系列算法,把它們一個個封裝起來,并且使它們可相互替換,使用得算法的變化可獨立于使用它的客戶,簡單來講就是,策略模式設計幫助構建的對象不必自身包含邏輯,而是能夠根據(jù)需要利用其他對象中的算法。

來看下應用場景:

       1、 多個類只區(qū)別在表現(xiàn)行為不同,可以使用Strategy模式,在運行時動態(tài)選擇具體要執(zhí)行的行為。

       2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現(xiàn)。

       3、 對客戶隱藏具體策略(算法)的實現(xiàn)細節(jié),彼此完全獨立。

       4、客戶端必須知道所有的策略類,并自行決定使用哪一個策略類,策略模式只適用于客戶端知道所有的算法或行為的情況。

       5、 策略模式造成很多的策略類,每個具體策略類都會產(chǎn)生一個新類。

有點模糊是吧,咱就來看一個完整的應用場景:

例如有一個CD類,我們類存儲了CD的信息。
原先的時候,我們在CD類中直接調用getCD方法給出XML的結果
隨著業(yè)務擴展,需求方提出需要JSON數(shù)據(jù)格式輸出
這個時候我們引進了策略模式,可以讓使用方根據(jù)需求自由選擇是輸出XML還是JSON
大概了解了之后,咱們來看一個代碼實例,我在網(wǎng)上找的啊,比較簡單,大家可以根據(jù)自己需要的來擴展一下,如下:

?php
 //策略模式
 //cd類
 class cd {
  protected $cdArr;
  public function __construct($title, $info) { 
   $this->cdArr['title'] = $title;
   $this->cdArr['info'] = $info;
  }
  public function getCd($typeObj) {
   return $typeObj->get($this->cdArr);
  } 
 }
 class json {
  public function get($return_data) {
   return json_encode($return_data);
  }
 }
 class xml {
  public function get($return_data) {
    $xml = '?xml version="1.0" encoding="utf-8"?>';
    $xml .= 'return>';
     $xml .= 'data>' .serialize($return_data). '/data>';
    $xml .= '/return>';
    return $xml;
  }
 }
 $cd = new cd('cd_1', 'cd_1');
 echo $cd->getCd(new json);
 echo $cd->getCd(new xml);

咱們接下來,再來了解一下一個網(wǎng)上比較經(jīng)典的案例,來看張圖片:

上面圖片的意思可以按著下面這個方式來理解:

1.Joe做了一套相當成功的模擬鴨子的游戲。設計了一個超類Duck,然后讓各種鴨子繼承這個類。

2.后來客戶提出要讓鴨子有飛的能力。所以Joe就在超類中加了個fly()方法,這樣下面的子類都有飛行的行為。

   問題來了:1>原來Duck的子類中竟然有橡皮鴨,橡皮鴨是不會飛的。——Joe用重載的方式,把橡皮鴨的fly()方法設置為空.

                   2>覆蓋fly(),我們看到了橡皮鴨的fly()里,沒有任何代碼,如果以后我們再添加別的不會飛的鴨子,那我么還要這么處理嗎?——那么代碼重復了!

3.上面2的方式我們知道是有問題的,所以Joe想到把Duck做成接口,這樣每個子類必須實現(xiàn)Duck里的方法。這樣就保證每個鴨子都能根據(jù)自己的需要添加行為。

     問題來了:產(chǎn)品經(jīng)常處于更新中,規(guī)格也在不斷的變化。導致每當有新鴨子的時候,Joe就要被迫檢查一遍子類是否覆蓋了fly()方法?!斈阈薷哪硞€行為的時候,你必須得往下追蹤并在每一個定義此行為的類中修改它。

4.綜合以上問題,Joe想到了把那些變化的部分從不變化的位置中抽出來。比如,我們對fly()行為,做了單獨的接口FlyBehavior。如果鴨子想要飛行功能的時候,我們就讓鴨子實現(xiàn)FlyBehavior.

5.深造:我們想讓鴨子有不同的飛行功能,讓它在運行時候做不同的飛行動作。讓鴨子類實現(xiàn)接口,只能讓鴨子有一種行為。

好,接下來看下代碼實例:

?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();

運行結果:

Fly With Wings
Fly With No Wings

咱們可以來總結下在開發(fā)過程中,這些設計模式的設計原則,如下:

1.找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起;

2.針對接口編程,不針對實現(xiàn)編程;

3.多用組合,少用繼承;

好啦,本次記錄就到這里了。

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • PHP pthreads v3下worker和pool的使用方法示例
  • PHP-FPM 設置多pool及配置文件重寫操作示例
  • PHP設計模式之建造者模式(Builder)原理與用法案例詳解
  • PHP設計模式之適配器模式(Adapter)原理與用法詳解
  • PHP設計模式之單例模式入門與應用詳解
  • PHP設計模式之觀察者模式入門與應用案例詳解
  • php設計模式之單例模式用法經(jīng)典示例分析
  • php設計模式之觀察者模式定義與用法經(jīng)典示例
  • 淺談PHP設計模式之對象池模式Pool

標簽:江門 深圳 內江 雙鴨山 駐馬店 大同 石嘴山

巨人網(wǎng)絡通訊聲明:本文標題《PHP設計模式之策略模式(Strategy)入門與應用案例詳解》,本文關鍵詞  PHP,設計模式,之,策略,模式,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP設計模式之策略模式(Strategy)入門與應用案例詳解》相關的同類信息!
  • 本頁收集關于PHP設計模式之策略模式(Strategy)入門與應用案例詳解的相關信息資訊供網(wǎng)民參考!
  • 推薦文章