首頁 > 後端開發 > php教程 > Head First-策略模式

Head First-策略模式

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-08-08 09:30:50
原創
1260 人瀏覽過

策略模式,什麼是策略模式,定義了演算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。

下面我們就用鴨子來詮釋一下策略模式,鴨子有兩種行為呱呱叫和飛,但是並不是所有的鴨子都會呱呱叫和飛,所以我們把這兩個賦予變化的行為提取出來。

<?php
abstract class Duck{
    public $flyBehavior;
    public $quackBehavior;    

    public function __construct(){
    }

    public function performFly(){
        $this->flyBehavior->fly();
    }

    public function performQuack(){
        $this->quackBehavior->quack();
    }

    public function setFlyBehavior(FlyBehavior $fb){
        $this->flyBehavior = $fb;
    }

    public function setQuackBehavior(QuackBehavior $qb){
        $this->quackBehavior = $qb;
    }

    public function swim(){

    }
    
    abstract function display();
}

interface FlyBehavior{
    public function fly();
}
class FlywithWings implements FlyBehavior{
    public function fly(){
        echo "i'm flying!\n";
    }
}
class FlyNoWay implements FlyBehavior{
    public function fly(){
        echo "i can't fly.\n";
    }
}
class FlyRocketPowered implements FlyBehavior{
    public function fly(){
        echo "i'm flying with a rocket!\n";
    }
}

interface QuackBehavior{
    public function quack();
}
class Quack implements QuackBehavior{
    public function quack(){
        echo "quack!\n";
    }
}
class MuteQuack implements QuackBehavior{
    public function quack(){
        echo "silence\n";
    }
}


class MallardDuck extends Duck{
    public function __construct(){
        $this->quackBehavior = new Quack();
        $this->flyBehavior = new FlyNoWay();
    }

    public function display(){
        echo "i'm a real mallar duck\n";
    }    
}

$duck = new MallardDuck;
$duck->performFly();
$duck->setFlyBehavior(new FlyRocketPowered);
$duck->performFly();
?>
登入後複製

 從上面的程式碼可以看出我們把鴨子抽像出來,而飛行行為和呱呱叫行車以介面的形式,設計的原則是多用組合,少用繼承,用上面的寫法,相對彈性大點,不僅將演算法封裝成類,更可以“在運行時動態的改變行為”,只要組合行為物件符合正確的介面標準即可。

以上就介紹了Head First-策略模式,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
function mysqli() 錯誤
來自於 1970-01-01 08:00:00
0
0
0
javascript - JS中的Function()函數對象
來自於 1970-01-01 08:00:00
0
0
0
javascript - !function()的問題
來自於 1970-01-01 08:00:00
0
0
0
javascript - 關於jquery中$(function(){})的使用。
來自於 1970-01-01 08:00:00
0
0
0
angular.js - Angularjs如何建立 公共function
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板