目的
分离「策略」并使他们之间能互相快速切换。此外,这种模式是一种不错的继承替代方案(替代使用扩展抽象类的方式)。
例子
UML图
★官方PHP高级学习交流社群「点击」管理整理了一些资料,BAT等一线大厂进阶知识体系备好(相关学习资料以及笔面试题)以及不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货
代码
{/*** @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;}
}
{/*** @param mixed $a* @param mixed $b** @return int*/public function compare($a, $b): int;
}
{/*** &#64;param mixed $a* &#64;param mixed $b** &#64;return int*/public function compare($a, $b): int{$aDate &#61; new \DateTime($a[&#39;date&#39;]);$bDate &#61; new \DateTime($b[&#39;date&#39;]);return $aDate <&#61;> $bDate;}
}
{/*** &#64;param mixed $a* &#64;param mixed $b** &#64;return int*/public function compare($a, $b): int{return $a[&#39;id&#39;] <&#61;> $b[&#39;id&#39;];}
}
测试
use DesignPatterns\Behavioral\Strategy\DateComparator;
use DesignPatterns\Behavioral\Strategy\IdComparator;
use PHPUnit\Framework\TestCase;class StrategyTest extends TestCase
{public function provideIntegers(){return [[[[&#39;id&#39; &#61;> 2], [&#39;id&#39; &#61;> 1], [&#39;id&#39; &#61;> 3]],[&#39;id&#39; &#61;> 1],],[[[&#39;id&#39; &#61;> 3], [&#39;id&#39; &#61;> 2], [&#39;id&#39; &#61;> 1]],[&#39;id&#39; &#61;> 1],],];}public function provideDates(){return [[[[&#39;date&#39; &#61;> &#39;2014-03-03&#39;], [&#39;date&#39; &#61;> &#39;2015-03-02&#39;], [&#39;date&#39; &#61;> &#39;2013-03-01&#39;]],[&#39;date&#39; &#61;> &#39;2013-03-01&#39;],],[[[&#39;date&#39; &#61;> &#39;2014-02-03&#39;], [&#39;date&#39; &#61;> &#39;2013-02-01&#39;], [&#39;date&#39; &#61;> &#39;2015-02-02&#39;]],[&#39;date&#39; &#61;> &#39;2013-02-01&#39;],],];}/*** &#64;dataProvider provideIntegers** &#64;param array $collection* &#64;param array $expected*/public function testIdComparator($collection, $expected){$obj &#61; new Context(new IdComparator());$elements &#61; $obj->executeStrategy($collection);$firstElement &#61; array_shift($elements);$this->assertEquals($expected, $firstElement);}/*** &#64;dataProvider provideDates** &#64;param array $collection* &#64;param array $expected*/public function testDateComparator($collection, $expected){$obj &#61; new Context(new DateComparator());$elements &#61; $obj->executeStrategy($collection);$firstElement &#61; array_shift($elements);$this->assertEquals($expected, $firstElement);}
}
PHP 互联网架构师成长之路*「设计模式」终极指南
PHP 互联网架构师 50K 成长指南&#43;行业问题解决总纲&#xff08;持续更新&#xff09;
面试10家公司&#xff0c;收获9个offer&#xff0c;2020年PHP 面试问题
★如果喜欢我的文章&#xff0c;想与更多资深开发者一起交流学习的话&#xff0c;获取更多大厂面试相关技术咨询和指导&#xff0c;欢迎加入我们的群啊&#xff0c;暗号&#xff1a;phpzh
2020年最新PHP进阶教程&#xff0c;全系列&#xff01;
内容不错的话希望大家支持鼓励下点个赞/喜欢&#xff0c;欢迎一起来交流&#xff1b;另外如果有什么问题 建议 想看的内容可以在评论提出