【发布时间】:2018-08-02 17:19:27
【问题描述】:
我对策略模式有疑问。通常策略模式是这样的:
class TaxCalculatorContext
{
private $strategy;
public function setStrategy(TaxCalculatorStrategyInterface $strategy)
{
$this->strategy = $strategy;
}
public function execute($amount)
{
return $this->strategy->calculate($amount);
}
}
class TaxCalculatorOntario implements TaxCalulatorStrategyInterface
{
public function calculate($amount)
{
...calculate ontario taxes here
}
}
class TaxCalculatorQuebec implements TaxCalculatorStrategyInterface
{
public function calculate($amount)
{
...calculate quebec taxes here
}
}
interface TaxCalculatorStrategyInterface
{
public function calculate($amount);
}
我想知道在一个上下文中使用多种策略是否是一种可接受的做法。请看下面的代码。
class TaxCalculatorContext
{
private $strategies;
public function addStrategy(TaxCalculatorStrategyInterface $strategy)
{
$this->strategies[] = $strategy;
}
public function execute($amount)
{
foreach ($this->strategies as $strategy)
{
if($strategy->canCalculate)
{
return $strategy->calculate($amount);
}
}
}
}
class TaxCalculatorOntario implements TaxCalulatorStrategyInterface
{
public function canCalculate($amount)
{
... returns true or false
}
public function calculate($amount)
{
...calculate ontario taxes here
}
}
class TaxCalculatorQuebec implements TaxCalculatorStrategyInterface
{
public function canCalculate($amount)
{
... returns true or false
}
public function calculate($amount)
{
...calculate quebec taxes here
}
}
interface TaxCalculatorStrategyInterface
{
public function canCalculate($amount);
public function calculate($amount);
}
如您所见,我不是只传递一个策略,而是在 TaxCalculatorContext 中创建了一组策略。然后,当调用 execute 方法时,策略会被循环,第一个在 canCalulate 方法中返回 true 的策略将被执行。那么这是一种标准做法还是我应该避免它?
【问题讨论】:
标签: php oop strategy-pattern