设计模式之行为型模式―― 3.1 策略模式

时间:2021-06-03 22:00:11
<?php
/**
 * 3.1 策略模式
 * 定义:
 *      它定义了算法家族,分别封装起来,让它们之间可以互相
 *      替换,此模式让算法的变化,不会影响到使用算法的客户。
 * 角色:
 *      1. 抽象算法类
 *      2. 具体算法类
 *      3. 上下文类
 * 优点:
 *      1. 提供了挂历相关算法族的办法。策略类的等级结构定义
 *         了一个算法或行为族。恰当的使用继承可以把公共的代
 *         码转移到父类里面,从而避免重复的代码。
 *      2. 提供了替换继承关系的办法。继承可以处理多种算法和
 *         行为。如果不是使用策略模式,那么使用算法或行为的
 *         环境就看可能会有一些子类,每一个子类提供一个不同
 *         的算法或行为。但是这样一来算法或行为的使用者就和
 *         算法或行为本身混在一起。决定使用哪一种算法或采取
 *         哪一种行为的逻辑就和算法或行为的逻辑混在一起,从
 *         而不可能在独立演化。继承使得动态改变算法或行为变
 *         的不可能。
 *      3. 使用策略模式可以避免使用多重条件转移语句。多重转
 *         移语句不易维护,它把采取哪一种算法或采取哪一种行
 *         为的逻辑与算法或行为的逻辑混在一起,统统列在一个
 *         多重转移条件里面,比使用继承的部分还要原始和落后
 * 缺点:
 *      1. 客户端必须知道所有的策略类,并自行决定使用哪一个
 *         策略类。这就意味着客户端必须理解这些算法的区别,
 *         以便适时选择恰当的算法类。换言之,策略模式只适用
 *         于客户端知道所有算法或行为的情况。
 *      2. 策略模式造成很多的策略类,每个具体策略类都会产生
 *         一个新类。有时候可以通过把依赖于环境的状态保存到
 *         客户端里面,而将处理类设计成可共享的,这样策略类
 *         可以被不同客户端使用。换言之,可以使用享元模式来
 *         减少对象的数量。
 * 使用场景:
 *      1. 多个类只区别在表现行为不同,可以使用此模式,在运
 *         行时选择具体要执行的行为。
 *      2. 需要在不同情况下是使用不同的策略,或者策略还可能
 *         在未来用其他方式来实现。
 *      3. 对客户隐藏具体策略的实现细节,彼此完全对立。
 */
header('content-type:text/html;charset=utf8');

//抽象算法类
abstract class Strategy{
    abstract public function AlgorithmInterface();
}
//具体算法类A
class ConcreteStrategyA extends Strategy{
    public function AlgorithmInterface(){
        echo '算法A实现';
    }
}
//具体算法类B
class ConcreteStrategyB extends Strategy{
    public function AlgorithmInterface(){
        echo '算法B实现';
    }
}
//具体算法类C
class ConcreteStrategyC extends Strategy{
    public function AlgorithmInterface(){
        echo '算法C实现';
    }
}
//上下文
class Context{
    private $strategy;
    public function __construct(Strategy $strategy){
        $this->strategy=$strategy;
    }
    //得到具体算法的结果
    public function getResult(){
        $this->strategy->AlgorithmInterface();
    }
}
//上下文类――改进版
class ContextImprove{
    public static function getResult($Algorithm){
        $str='ConcreteStrategy'.$Algorithm;
        $alg=new ReflectionClass($str);
        return $alg->newInstance()->AlgorithmInterface();
    }
}


//客户端
$context=new Context(new ConcreteStrategyA());
$context->getResult();

echo '<br/>';

//客户端――改进版
echo ContextImprove::getResult('A');


本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614783