设计模式之策略模式

策略模式:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。这么说或许有点抽象, 设想有这么一种场景。 我们写了一个博客网站,为了能够方便的更换外观, 我们指定了一个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('');

策略模式的优点:

  1. 减少了if/else, 这是最直观的了

  2. 便于扩展, 增加新主题的时候, 不必修改blog的render方法,就可以完成扩展

  3. 便于维护, 和上一条的理由一致.