摘要:簡(jiǎn)介策略模式定義了算法族,分別封裝起來(lái),讓他們之間可以相互替換。策略模式提供了可以替換繼承關(guān)系的辦法。使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。
簡(jiǎn)介
策略模式定義了算法族,分別封裝起來(lái),讓他們之間可以相互替換。該模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
組成抽象策略角色: 策略類,通常由一個(gè)接口或者抽象類實(shí)現(xiàn)。
具體策略角色:包裝了相關(guān)的算法和行為。
環(huán)境角色:持有一個(gè)策略類的引用,最終給客戶端調(diào)用。
應(yīng)用場(chǎng)景多個(gè)類只區(qū)別在表現(xiàn)行為不同,可以使用策略模式,在運(yùn)行時(shí)動(dòng)態(tài)選擇具體要執(zhí)行的行為。
需要在不同情況下使用不同的策略(算法),或者策略還可能在未來(lái)用其它方式來(lái)實(shí)現(xiàn)。
對(duì)客戶隱藏具體策略(算法)的實(shí)現(xiàn)細(xì)節(jié),彼此完全獨(dú)立。
實(shí)現(xiàn) 步驟定義抽象角色類(定義好各個(gè)實(shí)現(xiàn)的共同抽象方法)
定義具體策略類(具體實(shí)現(xiàn)父類的共同方法)
定義環(huán)境角色類(接收保存實(shí)例,統(tǒng)一執(zhí)行策略類接口方法)
代碼"; } } /** * Class byBus具體策略角色 * 乘公交 */ class byBus implements Travel { public function go() { echo "我乘公交出去玩運(yùn)行結(jié)果
"; } } /** * Class byMetro 具體策略角色 * 乘地鐵 */ class byMetro implements Travel { public function go() { echo "我乘地鐵出去玩
"; } } /** * Class byTrain 具體策略角色 * 乘火車 */ class byTrain implements Travel { public function go() { echo "我乘火車出去玩
"; } } /** * Class byAirplane 具體策略角色 * 乘飛機(jī) */ class byAirplane implements Travel { public function go() { echo "我乘飛機(jī)出去玩
"; } } /** * Class bySteamship 具體策略角色 * 乘輪船 */ class bySteamship implements Travel { public function go() { echo "我乘輪船出去玩
"; } } /** * Class Mine 環(huán)境角色 */ class Mine{ private $_strategy; private $_isChange = false; /** * 構(gòu)造方法 * 此處使用到了依賴注入和類型約束的概念,詳情請(qǐng)參考 * 1.聊一聊PHP的依賴注入(DI) 和 控制反轉(zhuǎn)(IoC) * @link https://segmentfault.com/a/1190000007209266 * 2.淺談PHP的類型約束 * @link https://segmentfault.com/a/1190000007226476 * * @param Travel $travel */ public function __construct(Travel $travel) { $this->_strategy = $travel; } /** * 改變出行方式 * * @param Travel $travel */ public function change(Travel $travel) { $this->_strategy = $travel; $this->_isChange = true; } public function goTravel() { if ($this->_isChange) { echo "現(xiàn)在改變主意,"; $this->_strategy->go(); } else { $this->_strategy->go(); } } } /** * 客戶端使用 */ $strategy = new Mine(new byBus()); // 乘公交 $strategy->goTravel(); // 乘地鐵 $strategy->change(new byMetro()); $strategy->goTravel(); // 自駕車 $strategy->change(new bySelfDriving()); $strategy->goTravel(); // 其他根據(jù)具體應(yīng)用選擇實(shí)現(xiàn)
我乘公交出去玩 現(xiàn)在改變主意,我乘地鐵出去玩 現(xiàn)在改變主意,我自己開(kāi)著車出去玩優(yōu)缺點(diǎn) 優(yōu)點(diǎn)
策略模式提供了管理相關(guān)的算法族的辦法。策略類的等級(jí)結(jié)構(gòu)定義了一個(gè)算法或行為族。恰當(dāng)使用繼承可以把公共的代碼轉(zhuǎn)移到父類里面,從而避免重復(fù)的代碼。
策略模式提供了可以替換繼承關(guān)系的辦法。繼承可以處理多種算法或行為。如果不是用策略模式,那么使用算法或行為的環(huán)境類就可能會(huì)有一些子類,每一個(gè)子類提供一個(gè)不同的算法或行為。但是,這樣一來(lái)算法或行為的使用者就和算法或行為本身混在一起。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯混合在一起,從而不可能再獨(dú)立演化。繼承使得動(dòng)態(tài)改變算法或行為變得不可能。
使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句。多重轉(zhuǎn)移語(yǔ)句不易維護(hù),它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統(tǒng)統(tǒng)列在一個(gè)多重轉(zhuǎn)移語(yǔ)句里面,比使用繼承的辦法還要原始和落后。
缺點(diǎn)客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時(shí)選擇恰當(dāng)?shù)乃惴?。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。
策略模式造成很多的策略類,每個(gè)具體策略類都會(huì)產(chǎn)生一個(gè)新類。有時(shí)候可以通過(guò)把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設(shè)計(jì)成可共享的,這樣策略類實(shí)例可以被不同客戶端使用。換言之,可以使用享元模式來(lái)減少對(duì)象的數(shù)量。
附錄聊一聊PHP的依賴注入(DI) 和 控制反轉(zhuǎn)(IoC):https://segmentfault.com/a/11...
淺談PHP的類型約束:https://segmentfault.com/a/11...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/22054.html
摘要:策略模式介紹策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。使用策略模式的好處策略模式提供了管理相關(guān)的算法族的辦法。使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試常考之設(shè)計(jì)模式——工...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:策略模式概念策略模式針對(duì)一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中此模式讓算法的變化獨(dú)立于使用算法的客戶。從而讓程序結(jié)構(gòu)更靈活,具有更好的擴(kuò)展性和維護(hù)性策略模式結(jié)構(gòu)圖策略模式角色說(shuō)明抽象策略角色定義所有支持的算法的公共接口。 策略模式概念 策略模式針對(duì)一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中,此模式讓算法的變化獨(dú)立于使用算法的客戶。從而讓程序結(jié)構(gòu)更靈活,具有更好的...
摘要:設(shè)計(jì)模式系列之入門設(shè)計(jì)模式是一套被反復(fù)使用多數(shù)人知曉的經(jīng)過(guò)分類編目的代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。毫無(wú)疑問(wèn),設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的設(shè)計(jì)模式使代碼編制真正工程化設(shè)計(jì)模式是軟件工程的基石脈絡(luò),如同大廈的結(jié)構(gòu)一樣。 PHP設(shè)計(jì)模式系列之入門 設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易...
閱讀 2088·2021-11-24 09:39
閱讀 1552·2021-10-11 10:59
閱讀 2499·2021-09-24 10:28
閱讀 3377·2021-09-08 09:45
閱讀 1269·2021-09-07 10:06
閱讀 1667·2019-08-30 15:53
閱讀 2061·2019-08-30 15:53
閱讀 1420·2019-08-30 15:53