美文网首页
PHP设计模式之策略模式(Strategy)代码实例大全(30)

PHP设计模式之策略模式(Strategy)代码实例大全(30)

作者: 八重樱勿忘 | 来源:发表于2020-09-21 16:44 被阅读0次

    目的

    分离「策略」并使他们之间能互相快速切换。此外,这种模式是一种不错的继承替代方案(替代使用扩展抽象类的方式)。

    例子

    • 简化版的的单元测试:例如,在使用文件存储和内存存储之间互相切换

    • 对一个对象列表进行排序,一种按照日期,一种按照 id

    UML图

    ★官方PHP高级学习交流社群「点击」管理整理了一些资料,BAT等一线大厂进阶知识体系备好(相关学习资料以及笔面试题)以及不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货

    代码

    • Context.php
    
    <?php
    
    namespace DesignPatterns\Behavioral\Strategy;
    
    class Context
    {
        /**
         * @var ComparatorInterface
         */
        private $comparator;
    
        public function __construct(ComparatorInterface $comparator)
        {
            $this->comparator = $comparator;
        }
    
        public function executeStrategy(array $elements) : array
        {
            uasort($elements, [$this->comparator, 'compare']);
    
            return $elements;
        }
    }
    
    • ComparatorInterface.php
    
    <?php
    
    namespace DesignPatterns\Behavioral\Strategy;
    
    interface ComparatorInterface
    {
        /**
         * @param mixed $a
         * @param mixed $b
         *
         * @return int
         */
        public function compare($a, $b): int;
    }
    
    • DateComparator.php
    
    <?php
    
    namespace DesignPatterns\Behavioral\Strategy;
    
    class DateComparator implements ComparatorInterface
    {
        /**
         * @param mixed $a
         * @param mixed $b
         *
         * @return int
         */
        public function compare($a, $b): int
        {
            $aDate = new \DateTime($a['date']);
            $bDate = new \DateTime($b['date']);
    
            return $aDate <=> $bDate;
        }
    }
    
    • IdComparator.php
    
    <?php
    
    namespace DesignPatterns\Behavioral\Strategy;
    
    class IdComparator implements ComparatorInterface
    {
        /**
         * @param mixed $a
         * @param mixed $b
         *
         * @return int
         */
        public function compare($a, $b): int
        {
            return $a['id'] <=> $b['id'];
        }
    }
    

    测试

    • Tests/StrategyTest.php
    
    <?php
    
    namespace DesignPatterns\Behavioral\Strategy\Tests;
    
    use DesignPatterns\Behavioral\Strategy\Context;
    use DesignPatterns\Behavioral\Strategy\DateComparator;
    use DesignPatterns\Behavioral\Strategy\IdComparator;
    use PHPUnit\Framework\TestCase;
    
    class StrategyTest extends TestCase
    {
        public function provideIntegers()
        {
            return [
                [
                    [['id' => 2], ['id' => 1], ['id' => 3]],
                    ['id' => 1],
                ],
                [
                    [['id' => 3], ['id' => 2], ['id' => 1]],
                    ['id' => 1],
                ],
            ];
        }
    
        public function provideDates()
        {
            return [
                [
                    [['date' => '2014-03-03'], ['date' => '2015-03-02'], ['date' => '2013-03-01']],
                    ['date' => '2013-03-01'],
                ],
                [
                    [['date' => '2014-02-03'], ['date' => '2013-02-01'], ['date' => '2015-02-02']],
                    ['date' => '2013-02-01'],
                ],
            ];
        }
    
        /**
         * @dataProvider provideIntegers
         *
         * @param array $collection
         * @param array $expected
         */
        public function testIdComparator($collection, $expected)
        {
            $obj = new Context(new IdComparator());
            $elements = $obj->executeStrategy($collection);
    
            $firstElement = array_shift($elements);
            $this->assertEquals($expected, $firstElement);
        }
    
        /**
         * @dataProvider provideDates
         *
         * @param array $collection
         * @param array $expected
         */
        public function testDateComparator($collection, $expected)
        {
            $obj = new Context(new DateComparator());
            $elements = $obj->executeStrategy($collection);
    
            $firstElement = array_shift($elements);
            $this->assertEquals($expected, $firstElement);
        }
    }
    

    PHP 互联网架构师成长之路*「设计模式」终极指南

    PHP 互联网架构师 50K 成长指南+行业问题解决总纲(持续更新)

    面试10家公司,收获9个offer,2020年PHP 面试问题

    ★如果喜欢我的文章,想与更多资深开发者一起交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入我们的群啊,暗号:phpzh

    2020年最新PHP进阶教程,全系列!

    内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题 建议 想看的内容可以在评论提出

    相关文章

      网友评论

          本文标题:PHP设计模式之策略模式(Strategy)代码实例大全(30)

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