美文网首页
策略模式(strategy模式)

策略模式(strategy模式)

作者: 苏康申 | 来源:发表于2020-03-06 23:13 被阅读0次

    策略模式

    策略模式定义一系列算法,将每个算法封装起来,并让它们可以互相替换,策略模式让算法的变化不会
    影响到使用它的客户。策略模式是一种对象行为型模式。
    

    步骤组成:

    抽象策略角色:策略类,通常由一个接口抽或象类实现
    具体策略角色:封装了相关算法和行为,具体实现父类的共同方法
    环境角色:接收保存实例,统一执行策略类接口方法
    

    应用场景:

    多个类只区别在表现行为不同,在运行时动态选择具体要执行的行为
    对客户隐藏具体算法的实现细节,彼此完全独立
    需要在不同情况下使用不同算法
    

    优点:

    策略模式提供了管理相关算法的办法,恰当使用继承可以把公共代码写入父类,避免重复代码
    每个算法都有自己单独的类,可以通过自己单独的接口进行测试,简化了单元测试。
    

    缺点:

    客户端必须知道所有的策略类,并自行决定使用哪一个策略类,因此,策略模式只适用于客户端知道所有算法
    或行为的情况下。策略模式会造成很多策略类,每个具体策略类会产生一个新类。
    

    具体实现

    <?php
    
    /**
     * 抽象策略角色,以接口实现
     */
    interface Strategy {
     
        /**
         * 算法接口
         */
        public function algorithmInterface();
    }
     
    /**
     * 具体策略角色A
     */
    class ConcreteStrategyA implements Strategy {
     
        public function algorithmInterface() {
            echo 'algorithmInterface A<br />';
        }
    }
     
    /**
     * 具体策略角色B
     */
    class ConcreteStrategyB implements Strategy {
     
        public function algorithmInterface() {
            echo 'algorithmInterface B<br />';
        }
    }
     
    /**
     * 具体策略角色C
     */
    class ConcreteStrategyC implements Strategy {
     
        public function algorithmInterface() {
            echo 'algorithmInterface C<br />';
        }
    }
     
    /**
     * 环境角色
     */
    class Context {
        /* 引用的策略 */
        private $_strategy;
     
        public function __construct(Strategy $strategy) {
            $this->_strategy = $strategy;
        }
     
        public function contextInterface() {
            $this->_strategy->algorithmInterface();
        }
     
    }
     
    /**
     * 客户端
     */
    class Client {
     
        /**
         * Main program.
         */
        public static function main() {
            $strategyA = new ConcreteStrategyA();
            $context = new Context($strategyA);
            $context->contextInterface();
     
            $strategyB = new ConcreteStrategyB();
            $context = new Context($strategyB);
            $context->contextInterface();
     
            $strategyC = new ConcreteStrategyC();
            $context = new Context($strategyC);
            $context->contextInterface();
        }
     
    }
     
    Client::main();
    ?>
    

    相关文章

      网友评论

          本文标题:策略模式(strategy模式)

          本文链接:https://www.haomeiwen.com/subject/gzgorhtx.html