<?php
/**
* 定义策略接口
*
* Interface Strategy
*/
interface Strategy {
/**
* 计算
*
* @param int $numA 值A
* @param int $numB 值B
* @return mixed
*/
public function operation($numA, $numB);
}
/**
* 加法类
*
* Class Addition
*/
class Addition implements Strategy {
public function operation($numA, $numB) {
return $numA + $numB;
}
}
/**
* 减法类
*
* Class Subtraction
*/
class Subtraction implements Strategy {
public function operation($numA, $numB) {
return $numA - $numB;
}
}
/**
* 上下文(环境)
*
* Class Content
*/
class Context{
private $strategy;
public function __construct(Strategy $strategy) { // 1.类初始化时,传入策略对象
$this->strategy = $strategy; // 2.此时,$strategy属性为传入的Addition对象(加法)
} // 3.结束,出去了
public function contextInterface($numA, $numB) {
return $this->strategy->operation($numA, $numB);
}
}
/**
* 客户端调用
*/
$addObj = new Addition();
$addContext = new Context($addObj); // 0.实例化Context,传入Addition类(加法)
/**
* 4.此时,页面还没有结束,你new了Context,它仍然存在。
* 调用contextInterface时,其实就是$addObj->contextInterface
* contextInterface并不存在于Addition类中(加法),但你通过Context调用了自身的operation方法
*/
var_dump($addContext->contextInterface('1', '1'));
$subObj = new Subtraction();
$subContext = new Context($subObj);
var_dump($subContext->contextInterface('2', '1'));
策略模式的优点:
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好。
策略模式的缺点:
- 策略类会有很多。
- 客户端需要知道所有策略类。
策略模式的适用场景:
当一个系统需要动态地在几种算法中选择一种时。