设计模式PHP版三 - 策略模式

<?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'));

策略模式的优点:

  • 算法可以自由切换。
  • 避免使用多重条件判断。
  • 扩展性良好。

策略模式的缺点:

  • 策略类会有很多。
  • 客户端需要知道所有策略类。

策略模式的适用场景:
当一个系统需要动态地在几种算法中选择一种时。

点赞