PHP-设计模式-策略模式



/**
 * 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。
 * 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
 * 
 * 说说我对的策略模式和访问者模式的区分:
 * 乍一看,其实两者都挺像的,都是实体类依赖了外部实体的算法,但是:
 * 对于策略模式:首先你是有一堆算法,然后在不同的逻辑中去使用;
 * 对于访问者模式:实体的【结构是稳定的】,但是结构中元素的算法却是多变的,比如就像人吃饭这个动作
 * 是稳定不变的,但是具体吃的行为却又是多变的;
 * 
 * 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
 * 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
 */

/**
 * Interface Strategy
 */
interface Strategy
{
    public function doOperation($num1, $num2);
}


class OperationAdd implements Strategy
{
    public function doOperation($num1, $num2)
    {
        return $num1 + $num2;
    }
}

class OperationSubstract implements Strategy
{
    public function doOperation($num1, $num2)
    {
        return $num1 - $num2;
    }
}

class OperationMultiply implements Strategy
{
    public function doOperation($num1, $num2)
    {
        return $num1 * $num2;
    }
}

/**
 * Class Context
 */
class Context
{
    private $strategy;

    public function __construct(Strategy $strategy)
    {
        $this->strategy = $strategy;
    }

    public function executeStrategy($num1, $num2)
    {
        return $this->strategy->doOperation($num1, $num2);
    }
}


$context = new Context(new OperationAdd());
echo "10 + 5 = " . $context->executeStrategy(10, 5) . PHP_EOL;
$context = new Context(new OperationSubstract());
echo "10 - 5 = " . $context->executeStrategy(10, 5) . PHP_EOL;
$context = new Context(new OperationMultiply());
echo "10 * 5 = " . $context->executeStrategy(10, 5) . PHP_EOL;
  







你可能感兴趣的:(#,PHP设计模式,php,设计模式)