php設(shè)計(jì)模式之策略模式應(yīng)用案例詳解
本文實(shí)例講述了php設(shè)計(jì)模式之策略模式應(yīng)用。分享給大家供大家參考,具體如下:
策略模式
定義:
策略模式定義一系列的算法,將每個(gè)算法封裝起來(lái),并讓它們可以相互裝換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
角色分析:
- 抽象策略角色:策略類,通常由一個(gè)接口或者抽象類實(shí)現(xiàn);
- 具體策略角色:包裝了相關(guān)的算法和行為;
- 環(huán)境角色:持有一個(gè)策略類的引用,最終給客戶端用。
應(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):
<?php /** * Created by PhpStorm. * Author: zhaorui * Date: 2019/2/27 * Time: 10:55 */ header('Content-Type:text/html;charset=utf-8'); // 抽象策略接口 abstract class Strategy{ abstract function wayToSchool(); } //具體策略角色 class BikeStrategy extends Strategy{ function wayToSchool() { echo "騎自行車去上學(xué)".PHP_EOL; } } class BusStrategy extends Strategy{ function wayToSchool() { echo "乘公共汽車去上學(xué)".PHP_EOL; } } class TaxiStrategy extends Strategy{ function wayToSchool() { echo "坐出租去上學(xué)".PHP_EOL; } } // 環(huán)境角色 class Context{ private $strategy; function getStrategy($strategyName){ try{ $strategyReflection = new ReflectionClass($strategyName); $this->strategy = $strategyReflection->newInstance(); }catch (ReflectionException $e){ $this->strategy = ""; } } function goToSchool(){ $this->strategy->wayToSchool(); } } // 測(cè)試 $context = new Context(); $context->getStrategy('BusStrategy'); $context->goToSchool();
運(yùn)行結(jié)果
乘公共汽車去上學(xué)
優(yōu)點(diǎn):
- 策略模式提供了管理相關(guān)的算法族的辦法。策略類的等級(jí)結(jié)構(gòu)定義了一個(gè)算法或行為族。恰當(dāng)使用繼承可以把公共的代碼轉(zhuǎn)移到父類里面,從而避免重復(fù)的代碼。
- 策略模式提供了可以替換繼承關(guān)系的辦法。繼承可以處理多種算法或行為。如果不是用策略模式,那么使用算法或行為的環(huán)境類就可能會(huì)有一些子類,每一個(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ù)量。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP針對(duì)字符串開(kāi)頭和結(jié)尾的判斷方法
這篇文章主要介紹了PHP針對(duì)字符串開(kāi)頭和結(jié)尾的判斷方法,涉及php字符串操作的判斷、截取、判斷、比較等函數(shù)用法與注意事項(xiàng),需要的朋友可以參考下2016-07-07asp函數(shù)split()對(duì)應(yīng)php函數(shù)explode()
今天小編就為大家分享一篇關(guān)于asp函數(shù)split()對(duì)應(yīng)php函數(shù)explode(),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02PHP?trim函數(shù)對(duì)多字節(jié)字符的使用限制實(shí)例探究
這篇文章主要為大家介紹了PHP?trim函數(shù)對(duì)多字節(jié)字符的使用限制實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01