美文网首页PHP经验分享
设计模式(一):策略模式(strategy)

设计模式(一):策略模式(strategy)

作者: 小马别过河 | 来源:发表于2019-12-01 17:07 被阅读0次
    应用场景

    一般是用来根据不同的场景,来实现不同的策略。比如,公司在双十一做活动,某些商品打折,活动结束后,回复原本的价格。这时候,策略模式就很方便了。

    UML图
    策略模式UML.jpg

    策略(Strategy)

    定义所有支持的算法的公共接口。 Context 使用这个接口来调用某 ConcreteStrategy 定义的算法。

    策略实现(ConcreteStrategy)

    以 Strategy 接口实现某具体算法

    上下文(Context)

    用一个 ConcreteStrategy 对象来装配, 维护一个 Strategy 对象的引用,可定义一个接口让 Strategy 访问它的数据

    代码实现(PHP)
    1. strategy.php (策略类)
    <?php
    
    // 抽象策略类
    abstract class Strategy
    {
        //抽象算法,让不同的策略实现
        public abstract function AlgorithmInterface();
    }
    
    //具体的策略类
    class ConcreteStrategyA extends Strategy
    {
        public function AlgorithmInterface()
        {
            // TODO: Implement AlgorithmInterface() method.
            echo "A策略实现", PHP_EOL;
        }
    }
    
    class ConcreteStrategyB extends Strategy
    {
        public function AlgorithmInterface()
        {
            // TODO: Implement AlgorithmInterface() method.
            echo "B策略实现", PHP_EOL;
        }
    }
    
    class ConcreteStrategyC extends Strategy
    {
        public function AlgorithmInterface()
        {
            // TODO: Implement AlgorithmInterface() method.
            echo "C策略实现", PHP_EOL;
        }
    }
    
    1. context.php (上下文类)
    <?php
    require './strategy.php';
    // 上下文
    class Context
    {
        private $strategy;
    
        public function __construct(Strategy $strategy)
        {
            // 传一个策略进来
            $this->strategy = $strategy;
        }
    
        public function contextInterface()
        {
            $this->strategy->AlgorithmInterface();
        }
    }
    
    1. 调用示例 (main.php)
    <?php
    require_once './context.php';
    require_once './strategy.php';
    
    //调用示例
    $context = new Context(new ConcreteStrategyA());
    $context->contextInterface();
    
    $context= new Context(new ConcreteStrategyB());
    $context->contextInterface();
    
    $context = new Context(new ConcreteStrategyC());
    $context->contextInterface();
    
    1. 输出


      输出

    相关文章

      网友评论

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

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