簡介: 策略模式又叫做政策模式,用於如何組織和調用演算法的,是屬於行為型模式的一種。 策略模式需要三個角色構成: Context 封裝角色:也叫做上下文角色,起承上啟下封裝作用,屏蔽高層模塊對策略、演算法的直接訪問,封裝可能存在的變化。 Strategy 抽象策略角色:通常為介面,指定規則。 Concr ...
簡介:
策略模式又叫做政策模式,用於如何組織和調用演算法的,是屬於行為型模式的一種。
策略模式需要三個角色構成:
- Context 封裝角色:也叫做上下文角色,起承上啟下封裝作用,屏蔽高層模塊對策略、演算法的直接訪問,封裝可能存在的變化。
- Strategy 抽象策略角色:通常為介面,指定規則。
- ConcreteStrategy 具體策略角色:實現抽象策略中的操作,該類含有具體的演算法。
適用場景:
- 優化單元測試,每個測試都有自己獨特的演算法,可利用策略模式自定義實現。
- 實現同一類問題的不同解決方案的場景。
優點:
演算法可以通過參數自由切換。
方便擴展,增加策略只需要實現介面就行了。
缺點:
增加類數量。
其它:
與工廠模式的對比:
工廠模式是用來創建對象的。策略模式是如何組織、調用這些演算法。結果一樣但是初衷不同。
代碼:
//定義演算法介面 抽象策略角色
interface CalcInterface {
public function calc($num1, $num2);
}
//定義加法類 具體策略角色
class Add implements CalcInterface {
public function calc($num1, $num2) {
return $num1 + $num2;
}
}
//定義減法類 具體策略角色
class Sub implements CalcInterface {
public function calc($num1, $num2) {
return $num1 - $num2;
}
}
//上下文角色 承上啟下
class Context {
private $strategy;
public function __construct(CalcInterface $strategy) {
$this->strategy = $strategy;
}
public function run($num1, $num2) {
return $this->strategy->calc($num1, $num2);
}
}
//調用端==========================================================
echo (new Context(new Add()))->run(1,2);
echo (new Context(new Sub()))->run(1,2);