策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
- 策略模式使得算法可以在不影响到客户端的情况下发生变化,策略模式把行为和环境分开。
- 环境类负责维持和查询行为类,各种算法在具体的策略类中提供。
- 由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。
直接在控制器中实例化下对象即可;
new StrategyPractice();
class StrategyPractice{
public function __construct(){
echo "策略模式:<br><br>";
$strategyA = new ConcreteStrategyA();
$question = new Question($strategyA);
$question->handle_question();
$strategyB = new ConcreteStrategyB();
$question = new Question($strategyB);
$question->handle_question();
$strategyC = new ConcreteStrategyC();
$question = new Question($strategyC);
$question->handle_question();
}
}
// 抽象策略角色,以接口实现
interface Strategy{
public function doMethod(); //算法接口
}
// 具体策略角色A
class ConcreteStrategyA implements Strategy{
public function doMethod(){
echo "执行策略方案A<br>";
}
}
// 具体策略角色B
class ConcreteStrategyB implements Strategy{
public function doMethod(){
echo "执行策略方案B<br>";
}
}
// 具体策略角色C
class ConcreteStrategyC implements Strategy{
public function doMethod(){
echo "执行策略方案C<br>";
}
}
// 环境角色
class Question{
private $_strategy;
public function __construct(Strategy $strategy){
$this->_strategy = $strategy;
}
public function handle_question(){
$this->_strategy->doMethod();
}
}