學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)策略模式(strategy)
一、意圖
定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可相互替換。策略模式可以使算法可獨(dú)立于使用它的客戶而變化
策略模式變化的是算法
二、策略模式結(jié)構(gòu)圖

三、策略模式中主要角色
抽象策略(Strategy)角色:定義所有支持的算法的公共接口。通常是以一個(gè)接口或抽象來(lái)實(shí)現(xiàn)。Context使用這個(gè)接口來(lái)調(diào)用其ConcreteStrategy定義的算法
具體策略(ConcreteStrategy)角色:以Strategy接口實(shí)現(xiàn)某具體算法
環(huán)境(Context)角色:持有一個(gè)Strategy類的引用,用一個(gè)ConcreteStrategy對(duì)象來(lái)配置
四、策略模式的優(yōu)點(diǎn)和缺點(diǎn)
策略模式的優(yōu)點(diǎn):
1、策略模式提供了管理相關(guān)的算法族的辦法
2、策略模式提供了可以替換繼承關(guān)系的辦法 將算封閉在獨(dú)立的Strategy類中使得你可以獨(dú)立于其Context改變它
3、使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句。
策略模式的缺點(diǎn):
1、客戶必須了解所有的策略 這是策略模式一個(gè)潛在的缺點(diǎn)
2、Strategy和Context之間的通信開(kāi)銷
3、策略模式會(huì)造成很多的策略類
五、策略模式適用場(chǎng)景
1、許多相關(guān)的類僅僅是行為有異?!安呗浴碧峁┝艘环N用多個(gè)行為中的一個(gè)行為來(lái)配置一個(gè)類的方法
2、需要使用一個(gè)算法的不同變體。
3、算法使用客戶不應(yīng)該知道的數(shù)據(jù)。可使用策略模式以避免暴露復(fù)雜的,與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)
4、一個(gè)類定義了多種行為,并且 這些行為在這個(gè)類的操作中以多個(gè)形式出現(xiàn)。將相關(guān)的條件分支移和它們各自的Strategy類中以代替這些條件語(yǔ)句
六、策略模式與其它模式
Template模式:模板方法模式與策略模式的不同在于,策略模式使用委派的方法提供不同的算法行為,而模板方法使用繼承的方法提供不同的算法行為
享元模式(flyweight模式):如果有多個(gè)客戶端對(duì)象需要調(diào)用 同樣的一睦策略類的話,就可以使它們實(shí)現(xiàn)享元模式
七、策略模式PHP示例
<?php
/**
* 抽象策略角色,以接口實(shí)現(xiàn)
*/
interface Strategy {
/**
* 算法接口
*/
public function algorithmInterface();
}
/**
* 具體策略角色A
*/
class ConcreteStrategyA implements Strategy {
public function algorithmInterface() {
echo 'algorithmInterface A<br />';
}
}
/**
* 具體策略角色B
*/
class ConcreteStrategyB implements Strategy {
public function algorithmInterface() {
echo 'algorithmInterface B<br />';
}
}
/**
* 具體策略角色C
*/
class ConcreteStrategyC implements Strategy {
public function algorithmInterface() {
echo 'algorithmInterface C<br />';
}
}
/**
* 環(huán)境角色
*/
class Context {
/* 引用的策略 */
private $_strategy;
public function __construct(Strategy $strategy) {
$this->_strategy = $strategy;
}
public function contextInterface() {
$this->_strategy->algorithmInterface();
}
}
/**
* 客戶端
*/
class Client {
/**
* Main program.
*/
public static function main() {
$strategyA = new ConcreteStrategyA();
$context = new Context($strategyA);
$context->contextInterface();
$strategyB = new ConcreteStrategyB();
$context = new Context($strategyB);
$context->contextInterface();
$strategyC = new ConcreteStrategyC();
$context = new Context($strategyC);
$context->contextInterface();
}
}
Client::main();
?>
以上就是使用php實(shí)現(xiàn)策略模式的代碼,還有一些關(guān)于策略模式的概念區(qū)分,希望對(duì)大家的學(xué)習(xí)有所幫助。
- php設(shè)計(jì)模式 Strategy(策略模式)
- PHP設(shè)計(jì)模式之策略模式(Strategy)入門與應(yīng)用案例詳解
- php設(shè)計(jì)模式之策略模式應(yīng)用案例詳解
- PHP設(shè)計(jì)模式之策略模式原理與用法實(shí)例分析
- php設(shè)計(jì)模式之策略模式實(shí)例分析【星際爭(zhēng)霸游戲案例】
- PHP實(shí)現(xiàn)的策略模式簡(jiǎn)單示例
- PHP策略模式定義與用法示例
- PHP設(shè)計(jì)模式之觀察者模式(Observer)詳細(xì)介紹和代碼實(shí)例
- php設(shè)計(jì)模式 Template (模板模式)
- PHP常用的三種設(shè)計(jì)模式匯總
- php設(shè)計(jì)模式 Proxy (代理模式)
- PHP設(shè)計(jì)模式之 策略模式Strategy詳解【對(duì)象行為型】
相關(guān)文章
淺談PHP Extension的開(kāi)發(fā)——基礎(chǔ)篇
要開(kāi)發(fā)PHP擴(kuò)展,第一步要下載PHP源代碼,因?yàn)槔锩嬗虚_(kāi)發(fā)擴(kuò)展需要的工具。我下載的是PHP最新版本5.3.3,格式為tar.bz2壓縮包。2010-12-12
PHP中curl三種Post請(qǐng)求數(shù)據(jù)的方式小結(jié)
這篇文章主要給大家介紹了關(guān)于PHP中curl三種Post請(qǐng)求數(shù)據(jù)的方式,在PHP開(kāi)發(fā)的過(guò)程中經(jīng)常需要發(fā)送POST請(qǐng)求,POST相比GET要安全很多,而且傳輸?shù)臄?shù)據(jù)量也較大,需要的朋友可以參考下2023-09-09
PHP判斷遠(yuǎn)程圖片或文件是否存在的實(shí)現(xiàn)代碼
本篇文章主要是對(duì)PHP判斷遠(yuǎn)程圖片或文件是否存在的實(shí)現(xiàn)代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-02-02
PHP獲取某個(gè)月最大天數(shù)(最后一天)的方法
這篇文章主要介紹了PHP獲取某個(gè)月最大天數(shù)(最后一天)的方法,涉及php流程控制及數(shù)學(xué)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
PHP 加密 Password Hashing API基礎(chǔ)知識(shí)點(diǎn)
在本篇文章里小編給大家分享的是一篇關(guān)于PHP 加密 Password Hashing API基礎(chǔ)知識(shí)點(diǎn),有興趣的朋友們可以學(xué)習(xí)下。2020-03-03
php number_format() 函數(shù)通過(guò)千位分組來(lái)格式化數(shù)字的實(shí)現(xiàn)代碼
以下是對(duì)php中的number format()函數(shù)通過(guò)千位分組來(lái)格式化數(shù)字的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08

