您好,登錄后才能下訂單哦!
這篇文章給大家介紹php中策略模式的應用,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
策略模式
定義:
策略模式定義一系列的算法,將每個算法封裝起來,并讓它們可以相互裝換。策略模式讓算法獨立于使用它的客戶而獨立變化。
角色分析:
抽象策略角色:策略類,通常由一個接口或者抽象類實現;
具體策略角色:包裝了相關的算法和行為;
環境角色:持有一個策略類的引用,最終給客戶端用。
應用場景:
多個類只區別在表現行為不同,可以使用策略模式,在運行的時動態選擇具體要執行的行為。
需要在不同情況下使用不同的策略(算法) ,或者策略還可能在未來用其他方式來實現。
對客戶隱藏具策略(算法)的實現細節,彼此完全獨立。
代碼實現:
<?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 "騎自行車去上學".PHP_EOL; } } class BusStrategy extends Strategy{ function wayToSchool() { echo "乘公共汽車去上學".PHP_EOL; } } class TaxiStrategy extends Strategy{ function wayToSchool() { echo "坐出租去上學".PHP_EOL; } } // 環境角色 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(); } } // 測試 $context = new Context(); $context->getStrategy('BusStrategy'); $context->goToSchool();
運行結果
乘公共汽車去上學
優點:
策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行為族。恰當使用繼承可以把公共的代碼轉移到父類里面,從而避免重復的代碼。
策略模式提供了可以替換繼承關系的辦法。繼承可以處理多種算法或行為。如果不是用策略模式,那么使用算法或行為的環境類就可能會有一些子類,每一個子類提供不同的算法或行為。但是,這樣一來算法或行為的使用者就和算法或行為本身混在一起。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯混在一起,從而不可能再獨立演化。繼承使得動態改變算法或行為變得不可能。
使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為邏輯混合在一起,統統列在一個多重轉移語句里面,比使用繼承的辦法還要原始和落后。
缺點:
客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換而言之,策略模式只適用于客戶端知道的所有的算法或行為的情況。
策略模式造成很多的策略類,每個具體策略類都會產生一個新類。有時候可以通過把依賴于環境的狀態保存到客戶端里面,而將策略類設計成共享的,這樣策略類實例可以被不同客戶端使用。換而言之,可以使用享元模式來減少對象的數量。
關于php中策略模式的應用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。