簡介
策略模式可以在程式運作時更改其行為或演算法,你可以通過切換策略來改變另一種演算法,你需要一個介面來達代表這個策略類,然後在主要類當中去申明這個介面策略類,在需要變更時切換哪種策略來達成不同狀態下所需要的功能。舉個簡單的例子:小明同學需要計算3加4等於幾的問題? 可以有多種方式去算這個題目,方法一、 計算器輸入計算 方法二、鉛筆計算 …., 這種運算的方式就可以抽離出來作為策略。
實現方式
- 首先我們定義一個統一的策略排程器 Strategy.php
/**
* Interface Strategy.
*/
interface Strategy
{
/**
* @return int
*/
public function calculatePrice(int $price, int $count): int;
}
接下來逐個實現策略
WithCalculator.phpclass WithCalculator implements Strategy { public function calculate(int $a, int $b) { return $a + $b; } }
WithPencial.php
class WithPencial implements Strategy { public function calculate(int $a, int $b) { return $a + $b; } }
最後需要一個大類
Calculate.phpclass Calculate { protected int $a; protected int $b; protected Strategy $strategy; public function __construct(int $a, int $b, Strategy $strategy) { $this->a = $a; $this->b = $b; $this->strategy = $strategy; } public function changeStrategy(Strategy $strategy) { $this->strategy = $strategy; } public function calculate() { return $this->strategy->calculate($this->a, $this->b); } }
測試
class StrategyTest extends TestCase { /** * @test */ public function test_strategy() { $calculate = new Calculate(3, 4, new WithCalculator); $this->assertEquals(7, $calculate->calculate()); } }
```
本作品採用《CC 協議》,轉載必須註明作者和本文連結