學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)策略模式(strategy)
一、意圖
定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且使它們可相互替換。策略模式可以使算法可獨(dú)立于使用它的客戶而變化
策略模式變化的是算法
二、策略模式結(jié)構(gòu)圖
三、策略模式中主要角色
抽象策略(Strategy)角色:定義所有支持的算法的公共接口。通常是以一個(gè)接口或抽象來實(shí)現(xiàn)。Context使用這個(gè)接口來調(diào)用其ConcreteStrategy定義的算法
具體策略(ConcreteStrategy)角色:以Strategy接口實(shí)現(xiàn)某具體算法
環(huán)境(Context)角色:持有一個(gè)Strategy類的引用,用一個(gè)ConcreteStrategy對(duì)象來配置
四、策略模式的優(yōu)點(diǎn)和缺點(diǎn)
策略模式的優(yōu)點(diǎn):
1、策略模式提供了管理相關(guān)的算法族的辦法
2、策略模式提供了可以替換繼承關(guān)系的辦法 將算封閉在獨(dú)立的Strategy類中使得你可以獨(dú)立于其Context改變它
3、使用策略模式可以避免使用多重條件轉(zhuǎn)移語句。
策略模式的缺點(diǎn):
1、客戶必須了解所有的策略 這是策略模式一個(gè)潛在的缺點(diǎn)
2、Strategy和Context之間的通信開銷
3、策略模式會(huì)造成很多的策略類
五、策略模式適用場景
1、許多相關(guān)的類僅僅是行為有異?!安呗浴碧峁┝艘环N用多個(gè)行為中的一個(gè)行為來配置一個(gè)類的方法
2、需要使用一個(gè)算法的不同變體。
3、算法使用客戶不應(yīng)該知道的數(shù)據(jù)??墒褂貌呗阅J揭员苊獗┞稄?fù)雜的,與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)
4、一個(gè)類定義了多種行為,并且 這些行為在這個(gè)類的操作中以多個(gè)形式出現(xiàn)。將相關(guān)的條件分支移和它們各自的Strategy類中以代替這些條件語句
六、策略模式與其它模式
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í)例分析【星際爭霸游戲案例】
- PHP實(shí)現(xià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實(shí)現(xiàn)抓取HTTPS內(nèi)容
這篇文章主要介紹了PHP實(shí)現(xiàn)抓取HTTPS內(nèi)容,以及遇到的問題的解決方法,需要的朋友可以參考下2014-12-12php中時(shí)間函數(shù)date及常用的時(shí)間計(jì)算
本篇文章主要介紹了php中時(shí)間函數(shù)date及常用的時(shí)間計(jì)算的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-05-05php使用Jpgraph繪制復(fù)雜X-Y坐標(biāo)圖的方法
這篇文章主要介紹了php使用Jpgraph繪制復(fù)雜X-Y坐標(biāo)圖的方法,通過設(shè)置圖像陰影、邊距、字體、顏色、曲線等實(shí)現(xiàn)Jpgraph繪制復(fù)雜坐標(biāo)圖的功能,非常簡單實(shí)用,需要的朋友可以參考下2015-06-06PHP實(shí)現(xiàn)的簡單操作SQLite數(shù)據(jù)庫類與用法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的簡單操作SQLite數(shù)據(jù)庫類與用法,結(jié)合具體實(shí)例形式分析了php封裝的針對(duì)SQLite數(shù)據(jù)庫相關(guān)增刪改查操作技巧與使用方法,需要的朋友可以參考下2017-06-06PHP從零開始打造自己的MVC框架之類的自動(dòng)加載實(shí)現(xiàn)方法詳解
這篇文章主要介紹了PHP從零開始打造自己的MVC框架之類的自動(dòng)加載實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式詳細(xì)分析了MVC框架類的自動(dòng)加載原理、定義、實(shí)現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下2019-06-06兩級(jí)聯(lián)動(dòng)select刷新后其值保持不變的實(shí)現(xiàn)方法
兩級(jí)聯(lián)動(dòng)select刷新后,select值保持不變即點(diǎn)擊提交按鈕后,頁面select中繼續(xù)維持提交前的值,下面有個(gè)不錯(cuò)的示例,大家可以參考下2014-01-01dedecms中顯示數(shù)字驗(yàn)證碼的修改方法
dedecms中顯示數(shù)字驗(yàn)證碼的修改方法...2007-03-03PHP使用PDO從mysql讀取大量數(shù)據(jù)處理詳解
這篇文章主要給大家介紹了關(guān)于PHP使用PDO從mysql讀取大量數(shù)據(jù)處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-03-03php生成并下載word文件到本地實(shí)現(xiàn)方法詳解
要給最常用出租屋管理系統(tǒng)增加個(gè)合同功能,mark下知識(shí)點(diǎn)。要生成合同就需要使用phpword。文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08