首页
归档
朋友
关于我
留言
Search
1
虚拟机无法ping不通百度,并无法访问浏览器
4,847 阅读
2
mysql使用or条件使索引失效
4,061 阅读
3
mysql如何在一对多查询时选取时间最近的一条记录
3,475 阅读
4
根据MySQL获取当天,昨天,本周,本月,上周,上月,本月的起始时间
2,927 阅读
5
熟悉mysql的共享锁、排它锁、悲观锁、乐观锁以及使用场景
1,766 阅读
PHP
面向对象
设计模式
知识汇总
常用函数
PHP框架知识
数据库
MySQL
服务器
Docker
虚拟机
Nginx
缓存相关
Redis
前端
中间件
RabbitMQ
网络编程
HTTP相关
Swoole
Workerman
工具软件
Git
Typecho
杂乱无章
面试指南
PHP相关
MySQL面试汇总
中间件相关
开发技巧 | 优化
登录
Search
标签搜索
php
mysql
代码片段
linux
Thinkphp
Redis
nginx
mysql优化
docker
面试指南
面向对象
git
Laravel框架
http协议
RabbitMQ
Redis性能优化
设计模式
linux命令
编译安装
PhpSpreadsheet
黎明强
累计撰写
70
篇文章
累计收到
59
条评论
首页
栏目
PHP
面向对象
设计模式
知识汇总
常用函数
PHP框架知识
数据库
MySQL
服务器
Docker
虚拟机
Nginx
缓存相关
Redis
前端
中间件
RabbitMQ
网络编程
HTTP相关
Swoole
Workerman
工具软件
Git
Typecho
杂乱无章
面试指南
PHP相关
MySQL面试汇总
中间件相关
开发技巧 | 优化
页面
归档
朋友
关于我
留言
搜索到
1
篇与
设计模式
的结果
2022-11-08
项目代码if else太多,使用策略+工厂模式来解决
简述策略模式,又称为政策模式,属于行为型的设计模式。定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可独立于使用它的客户而变化 。业务场景假设有这样的业务场景,拉取不同部门的数据,根据不同的角色类型获取不同的Json内容数据,多数小伙伴会写出如下代码:if(type=="1"){ //按照1格式解析 }else if(type=="2"){ //按2格式解析 }else{ //按照默认格式解析 } 这个代码可能会存在哪些 问题呢 ?如果分支变多,这里的代码就会变得 臃肿,难以维护,可读性低 。如果你需要接入一种新的解析类型,那只能在 原有代码上修改 。说得专业一点的话,就是以上代码,违背了面向对象编程的开闭原则以及 单一原则 。开闭原则 (对于扩展是开放的,但是对于修改是封闭的):增加或者删除某个逻辑,都需要修改到原来代码单一原则 (规定一个类应该只有一个发生变化的原因):修改任何类型的分支逻辑代码,都需要改动当前类的代码。如果你的代码就是:有多个if...else等条件分支,并且每个条件分支,可以封装起来替换的,我们就可以使用策略模式来优化。策略模式使用一个接口或者抽象类,里面两个方法(一个方法匹配类型,一个可替换的逻辑实现方法)不同策略的差异化实现(就是说,不同策略的实现类)使用策略模式一个接口,两个方法不同策略的差异化实现示例封装接口类、策略实现类<?php //统一实现接口 interface Strategy { function send(); } //实现 class ServiceFollowLog implements Strategy { public function send() { // TODO: Implement get() method. echo "记录网络客服的日志"; } } class SaleFollowLog implements Strategy{ public function send() { // TODO: Implement get() method. echo "记录业务员日志"; } } // 工厂类 class Factory{ public $products=array(); public function get($type){ return $this->products[$type]; } public function register($type){ $class=ucfirst($type); $this->products[$type]=new $class; } } 应用层(接口):class user { // public $types=array("sms","email"); public $types= ["3"=> "ServiceFollowLog" , "4"=> "SaleFollowLog"]; public $factory=null; public function __construct(){ //先生成出所有策略的对象 $this->factory=new Factory(); foreach(array_values($this->types) as $t){ $this->factory->register($t); } } //-----新的代码示例:改造策略模式----------- public function newDoAction(){ //根据传递的type参数 , 选择使用哪一个策略 $post="3"; $notice=$this->factory->get($this->types[$post]); $notice->send(); } //---------旧的代码示例------------ public function OldDoAction(){ $type = "sms"; if($type == "sms"){ echo "sms"; }elseif ($type =="email"){ echo "email"; }elseif ($type == "qq"){ echo "qq"; } } } 调用输出// 输出 $u = new user(); $u->newDoAction();每个类都是一个策略,如果有新的策略,增只需要添加一个策略类并把类注册进来。保证了每个类的职责单一性
2022年11月08日
159 阅读
0 评论
0 点赞