热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

目的

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

例子


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

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


UML图

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

代码


  • Context.php


{/*** @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


{/*** @param mixed $a* @param mixed $b** @return int*/public function compare($a, $b): int;
}

  • DateComparator.php


{/*** &#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;}
}

  • IdComparator.php


{/*** &#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;];}
}

测试

  • Tests/StrategyTest.php


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;另外如果有什么问题 建议 想看的内容可以在评论提出


推荐阅读
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • “您可以从三个选项中(快速、便宜或好)选择两个”提出这个问题的人可能不是可观测性工程师。但也可能是,在可观测性方面,决定您 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • (九)Docker常用安装
    一、总体步骤1、搜索镜像2、拉取镜像3、查看镜像4、启动镜像5、停止镜像6、移除镜像二、安装tomcat1、dockerhub上面查找tomcat镜像 dockersearchto ... [详细]
author-avatar
盛如毓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有