最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年12月10日 10:07:23   作者:luyaran  
這篇文章主要介紹了PHP設(shè)計模式之策略模式(Strategy)入門與應(yīng)用,結(jié)合具體實例形式詳細分析了PHP策略模式的相關(guān)概念、原理、使用方法及操作注意事項,需要的朋友可以參考下

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

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

來看下應(yīng)用場景:

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

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

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

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

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

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

例如有一個CD類,我們類存儲了CD的信息。
原先的時候,我們在CD類中直接調(diào)用getCD方法給出XML的結(jié)果
隨著業(yè)務(wù)擴展,需求方提出需要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做了一套相當(dāng)成功的模擬鴨子的游戲。設(shè)計了一個超類Duck,然后讓各種鴨子繼承這個類。

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

   問題來了:1>原來Duck的子類中竟然有橡皮鴨,橡皮鴨是不會飛的?!狫oe用重載的方式,把橡皮鴨的fly()方法設(shè)置為空.

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

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

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

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

運行結(jié)果:

Fly With Wings
Fly With No Wings

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

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

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

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

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

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

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

相關(guān)文章

  • ThinkPHP3.1新特性之G方法的使用

    ThinkPHP3.1新特性之G方法的使用

    ThinkPHP3.1的G方法的作用包括標(biāo)記位置和區(qū)間統(tǒng)計兩個功能。這篇文章主要介紹了ThinkPHP3.1版G方法的使用,需要的朋友可以參考下
    2014-06-06
  • 學(xué)習(xí)PHP Cookie處理函數(shù)

    學(xué)習(xí)PHP Cookie處理函數(shù)

    這篇文章主要為大家詳細介紹了PHP Cookie處理函數(shù)的使用方法,感興趣的小伙伴們可以參考一下
    2016-08-08
  • laravel 判斷查詢數(shù)據(jù)庫返回值的例子

    laravel 判斷查詢數(shù)據(jù)庫返回值的例子

    今天小編就為大家分享一篇laravel 判斷查詢數(shù)據(jù)庫返回值的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • PHP通過pem文件校驗簽名異常問題解決

    PHP通過pem文件校驗簽名異常問題解決

    在對接第三方支付過程中,支付成功異步回調(diào)時,校驗簽名,一直無法通過,最后經(jīng)過排查,是引用秘鑰文件時,報錯了,本文給大家分享PHP通過pem文件校驗簽名異常問題解決方法,需要的朋友可以參考下
    2023-09-09
  • Laravel 5.4因特殊字段太長導(dǎo)致migrations報錯的解決

    Laravel 5.4因特殊字段太長導(dǎo)致migrations報錯的解決

    這篇文章主要給大家介紹了關(guān)于Laravel 5.4因特殊字段太長導(dǎo)致migrations報錯的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧。
    2017-10-10
  • Fleaphp常見函數(shù)功能與用法示例

    Fleaphp常見函數(shù)功能與用法示例

    這篇文章主要介紹了Fleaphp常見函數(shù)功能與用法,結(jié)合實例形式總結(jié)分析了Fleaphp框架中常見函數(shù)的功能、定義、使用方法與相關(guān)注意事項,需要的朋友可以參考下
    2016-11-11
  • PHP 使用位運算實現(xiàn)四則運算的代碼

    PHP 使用位運算實現(xiàn)四則運算的代碼

    這篇文章主要介紹了PHP 使用位運算實現(xiàn)四則運算的代碼,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Symfony2實現(xiàn)在doctrine中內(nèi)置數(shù)據(jù)的方法

    Symfony2實現(xiàn)在doctrine中內(nèi)置數(shù)據(jù)的方法

    這篇文章主要介紹了Symfony2實現(xiàn)在doctrine中內(nèi)置數(shù)據(jù)的方法,結(jié)合實例形式分析了在doctrine中內(nèi)置數(shù)據(jù)的具體步驟與相關(guān)技巧,需要的朋友可以參考下
    2016-02-02
  • PHP哈希表實現(xiàn)算法原理解析

    PHP哈希表實現(xiàn)算法原理解析

    這篇文章主要介紹了PHP哈希表實現(xiàn)算法原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • laravel http 自定義公共驗證和響應(yīng)的方法

    laravel http 自定義公共驗證和響應(yīng)的方法

    今天小編就為大家分享一篇laravel http 自定義公共驗證和響應(yīng)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09

最新評論

永胜县| 莎车县| 巨野县| 沙田区| 宁武县| 新安县| 辽阳市| 沿河| 沙湾县| 万州区| 新河县| 三都| 博乐市| 沿河| 密山市| 那坡县| 宁晋县| 洞口县| 晴隆县| 台江县| 若羌县| 承德县| 佳木斯市| 舟曲县| 漳平市| 惠州市| 什邡市| 镇雄县| 泾阳县| 岫岩| 大姚县| 德钦县| 浪卡子县| 稷山县| 丹凤县| 吉隆县| 苗栗县| 离岛区| 晋宁县| 贡觉县| 九江县|