策略模式
策略模式定義一系列算法,將每個(gè)算法封裝起來(lái),并讓他們可以相互替換.策略模式讓算法獨(dú)立于使用它的客戶(hù)而變化.
存在很多算法相似的情況下,使用if...else這些分支語(yǔ)句,才能實(shí)現(xiàn)需求,但是不足之處在于一旦需要增加條件,那么所有用到這些分支的地方都需要修改,使用策略模式需要增加新的策略只需再增加一個(gè)具體策略類(lèi)
目錄結(jié)構(gòu)
|strategy #項(xiàng)目根目錄
|--Think #核心類(lèi)庫(kù)
|----Loder.php #自動(dòng)加載類(lèi)
|----context.php #環(huán)境類(lèi)
|----manStrategy.php #男性用戶(hù)策略
|----womanStrategy.php #女性用戶(hù)策略
|----main #核心類(lèi)
|------strategy.php #抽象策略接口
|--index.php #單一的入口文件
代碼實(shí)例
抽象策略接口 Think/main/strategy.php
<?php
/**
* 抽象策略接口
*/
namespace Think\main;
abstract class strategy{
abstract function paddle();
}
男性用戶(hù)策略 Think/manStrategy.php
<?php
/**
* 男性用戶(hù)策略
*/
namespace Think;
use Think\main\strategy;
class manStrategy extends strategy{
public function paddle() {
echo '這里是男性用戶(hù)策略'.PHP_EOL;
}
}
女性用戶(hù)策略 Think/womanStrategy.php
<?php
/**
* 女性用戶(hù)策略
*/
namespace Think;
use Think\main\strategy;
class womanStrategy extends strategy{
public function paddle() {
echo '這里是女性用戶(hù)策略'.PHP_EOL;
}
}
環(huán)境類(lèi) Think/context.php
<?php
/**
* 環(huán)境類(lèi)
*/
namespace Think;
class context{
protected $stratgy;
public function __construct($sex) {
if($sex == 'man'){
$strategy = new manStrategy();
}else{
$strategy = new womanStrategy();
}
$this->stratgy = $strategy;
}
public function request() {
$this->stratgy->paddle();
}
}
自動(dòng)加載 Think/Loder.php
<?php
namespace Think;
class Loder{
static function autoload($class){
require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
}
}
入口文件 index.php
<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');
//假設(shè)用戶(hù)性別為男性
$sex = 'man';
//使用策略模式
$context = new \Think\context($sex);
$context->request();
優(yōu)點(diǎn): 1呻纹、算法可以自由切換。 2丰包、避免使用多重條件判斷栈拖。 3街州、擴(kuò)展性良好供鸠。
缺點(diǎn): 1密末、策略類(lèi)會(huì)增多抢腐。 2、所有策略類(lèi)都需要對(duì)外暴露奴饮。
使用場(chǎng)景: 1纬向、如果在一個(gè)系統(tǒng)里面有許多類(lèi),它們之間的區(qū)別僅在于它們的行為戴卜,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為逾条。 2、一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種投剥。 3师脂、如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J浇牵@些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)吃警。
注意事項(xiàng):如果一個(gè)系統(tǒng)的策略多于四個(gè),就需要考慮使用混合模式啄育,解決策略類(lèi)膨脹的問(wèn)題酌心。
上一篇 php設(shè)計(jì)模式之適配器模式
下一篇 php設(shè)計(jì)模式之?dāng)?shù)據(jù)映射模式