策略模式:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。这么说或许有点抽象, 设想有这么一种场景。 我们写了一个博客网站,为了能够方便的更换外观, 我们指定了一个theme参数, 并且在渲染的函数中进行了一系列的if/else判断(或者swith), 这样出现了什么问题呢, 每次我们尝试增加一种主题, 都不可避免的要修改render函数。这样显然不利于维护, 策略模式是通过注入不同的算法,来实现自动切换, 避免了不必要的if/else和对应用策略类的修改。

<?php
/**
* Created by PhpStorm.
* User: raye
* Date: 2018/3/20
* Time: 9:40
*/
/**
* 定义一个规范, 所有的主题都应该实现render方法
* Interface IThemeStrategy
*/
interface IThemeStrategy{
public function render($view);
}
class GeneralTheme implements IThemeStrategy {
public function render($view)
{
echo 'apply general theme successful.' . PHP_EOL;
}
}
class SimpleTheme implements IThemeStrategy{
public function render($view)
{
echo 'apply simple theme successful.' . PHP_EOL;
}
}
/**
* 通过使用构造函数注入不同的主题策略,当然也可以使用setter方式
* Class Blog
*/
class Blog
{
private $renderHandler;
/**
* Blog constructor.
* @param IThemeStrategy $renderHandler 约束类的行为
*/
public function __construct(IThemeStrategy $renderHandler)
{
$this->renderHandler = $renderHandler;
}
public function render($content){
$this->renderHandler->render($content);
}
}
$blog = new Blog(new GeneralTheme());
$blog->render('');
$blog = new Blog(new SimpleTheme());
$blog->render('');
策略模式的优点:
-
减少了if/else, 这是最直观的了
-
便于扩展, 增加新主题的时候, 不必修改blog的render方法,就可以完成扩展
-
便于维护, 和上一条的理由一致.