项目中的if else太多了,该怎么重构?

文章目录


我们有一部分业务逻辑是这样的

if (msgType = "文本") {// dosomething
} else if(msgType = "图片") {// doshomething
} else if(msgType = "视频") {// doshomething
} else {// doshomething
}

就是根据消息的不同类型有不同的处理策略,每种消息的处理策略代码都很长,如果都放在这种if else代码快中,代码很难维护也很丑,所以我们一开始就用了策略模式来处理这种情况。

策略模式还挺简单的,就是定义一个接口,然后有多个实现类,每种实现类封装了一种行为。然后根据条件的不同选择不同的实现类。

实现过程
消息对象,当然真实的对象没有这么简单,省略了很多属性

@Data
@AllArgsConstructor
public class MessageInfo {// 消息类型private Integer type;// 消息内容private String content;}

定义一个消息处理接口

public interface MessageService {void handleMessage(MessageInfo messageInfo);
}

有2个消息处理接口,分别处理不同的消息

处理文本消息

@Service
@MsgTypeHandler(value = MSG_TYPE.TEXT)
public class TextMessageService implements MessageService {@Overridepublic void handleMessage(MessageInfo messageInfo) {System.out.println("处理文本消息 " + messageInfo.getContent());}
}

处理图片消息

@Service
@MsgTypeHandler(value = MSG_TYPE.IMAGE)
public class ImageMessageService implements MessageService {@Overridepublic void handleMessage(MessageInfo messageInfo) {System.out.println("处理图片消息 " + messageInfo.getContent());}
}

文章写到这,可能大多数人可能会想到要需要如下一个Map, Map<消息类型,消息处理对象>,这样直接根据消息类型就能拿到消息处理对象,调用消息处理对象的方法即可。我们就是这样做的,但是我们不想手动维护这个Map对象,因为每次增加新的消息处理类,Map的初始化过程就得修改

我们使用了注解+ApplicationListener来保存这种映射关系,来看看怎么做的把

定义一个消息类型的枚举类

public enum MSG_TYPE {TEXT(1, "文本"),IMAGE(2, "图片"),VIDEO(3, "视频");public final int code;public final String name;MSG_TYPE(int code, String name) {this.code = code;this.name = name;}
}

定义一个注解

@Documented
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MsgTypeHandler {MSG_TYPE value();
}

不知道你注意到了没,前面的代码中,每种消息处理类上面都有一个@MsgTypeHandler注解,表明了这个处理类
处理哪种类型的消息

@Service
@MsgTypeHandler(value = MSG_TYPE.TEXT)
public class TextMessageService implements MessageService {@Overridepublic void handleMessage(MessageInfo messageInfo) {System.out.println("处理文本消息 " + messageInfo.getContent());}
}

用一个context对象保存了消息类型->消息处理对象的映射关系

@Component
public class MessageServiceContext {private final Map<Integer, MessageService> handlerMap = new HashMap<>();public MessageService getMessageService(Integer type) {return handlerMap.get(type);}public void putMessageService(Integer code, MessageService messageService) {handlerMap.put(code, messageService);}}

最精彩的部分到了

@Component
public class MessageServiceListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {Map<String, Object> beans = event.getApplicationContext().getBeansWithAnnotation(MsgTypeHandler.class);MessageServiceContext messageServiceContext = event.getApplicationContext().getBean(MessageServiceContext.class);beans.forEach((name, bean) -> {MsgTypeHandler typeHandler = bean.getClass().getAnnotation(MsgTypeHandler.class);messageServiceContext.putMessageService(typeHandler.value().code, (MessageService) bean);});}
}

在spring的启动过程中,通过解析注解,将消息类型->消息处理对象的映射关系保存到MessageServiceContext对象中

@Autowired
MessageServiceContext messageServiceContext;@Test
public void contextLoads() {// 构建一个文本消息MessageInfo messageInfo = new MessageInfo(MSG_TYPE.TEXT.code, "消息内容");MessageService messageService = messageServiceContext.getMessageService(messageInfo.getType());// 处理文本消息 消息内容// 可以看到文本消息被文本处理类所处理messageService.handleMessage(messageInfo);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于阿里云实现游戏数据运营(附Demo)

摘要&#xff1a; 原作者&#xff1a;阿里云解决方案架构师&#xff0c;陆宝。通过阅读本文&#xff0c;您可以学会怎样使用阿里云的maxcompute搭建一套数据分析系统。一、总览一个游戏/系统的业务数据分析&#xff0c;总体可以分为图示的几个关键步骤&#xff1a;1、数据采集&…

正式发布!鸿蒙,来了!

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 胡巍巍 发自东莞篮球中心出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;鸿蒙真的来了&#xff01;余承东宣布&#xff0c;鸿蒙的英文名叫HarmonyOS&#xff01;对于华为来讲&#xff0c;8月9日是华为开发者大会…

手机屏坏了怎么把里面存东西取出来_手机又卡了,到底是运行不够还是存储容量不足?1分钟搞懂...

现在的主流旗舰机个个都是6128GB起步了&#xff0c;如果手机卡了&#xff0c;是运行内存不够&#xff1f;还是存储容量不足&#xff1f;事实上&#xff0c;很多人都没搞清楚&#xff0c;机身内存和运行内存&#xff0c;其实是两码事。运行内存和机身内存有什么区别&#xff1f;…

android+模拟器+ram,Android模拟器RAM修改方法 - 尤其是3.0

我们以Windows平台的SDK为例&#xff0c;这里Android开发网的模拟器配置路径为 C:/Documents and Settings/android/.android/avd/android3.avd 下的 config.ini我们用记事本打开这个ini文件&#xff0c;当然我们可以看到Unix/Binary的换行符&#xff0c;建议你使用UltraEdit或…

在 React 工程中利用 Mota 编写面向对象的业务模型

摘要&#xff1a; ## 简述 React 是一个「视图层」的 UI 框架&#xff0c;以常见的 MVC 来讲 React 仅是 View&#xff0c;而我们在编写应用时&#xff0c;通常还需要关注更加重要的 model&#xff0c;对于 React 来讲&#xff0c;我们常常需要一个「状态管理」库。然而&#x…

SQL基础语句(详解版)

一、基础 1、说明&#xff1a;创建数据库 CREATE DATABASE database-name2、说明&#xff1a;删除数据库 drop database 数据库名3、说明&#xff1a;备份sql server — 创建 备份数据的 device USE master EXEC sp_addumpdevice ‘disk’, ‘testBack’, ‘c:\mssql7back…

惊呆了!颜值爆表的20+位阿里技术女神同一时间向你发出共事邀请!

摘要&#xff1a; 女神节快到了&#xff0c;云栖社区为此推出“三七”女神节特别分享&#xff0c;20位颜值爆表的阿里女神们同一时间向你发出了共事邀请&#xff0c;快来赴约吧&#xff01; 点此查看原文&#xff1a;http://click.aliyun.com/m/43263/ 女神节快要到了&#xff…

做了中台就不会死吗?每年至少40%开发资源是被浪费的!

戳蓝字“CSDN云计算”关注我们哦&#xff01;文/黄哲铿编辑/Emma上周受邀去一家互联网公司做分享&#xff0c;有学员提到一个问题&#xff1a;“技术中台&#xff0c;如何应对那么多小前台的需求&#xff1f;先做哪个&#xff0c;后做哪个&#xff1f;” 这是个比较普遍问题&am…

bucket sort sample sort 并行_IBM布局AI硬件大杀器:硬软件并行开发、开源模拟AI工具包...

原标题&#xff1a;IBM布局AI硬件大杀器&#xff1a;硬软件并行开发、开源模拟AI工具包智东西(公众号&#xff1a;zhidxcom)编 | 子佩智东西11月4日消息&#xff0c;为了解决AI对数据、能源和内存资源的巨大需求&#xff0c;IBM一直致力于开发节能的AI硬件加速器&#xff0c;希…

如何实现32.5万笔/秒的交易峰值?阿里交易系统TMF2.0技术揭秘

摘要&#xff1a; 交易平台遇到的挑战 2017双11&#xff0c;交易峰值达到了32.5万笔/秒&#xff0c;这给整个交易系统带来了非常大的挑战。 一方面&#xff0c;系统需要支撑全集团几十个事业部的所有交易类需求&#xff1a;要考虑如何能更快响应需求、加快发布周期&#xff1b;…

表达式汇总

流条件表达式 数字 ${applysum>200} ${applysum<200}字符串 ${outcome通过} ${outcome驳回}取反 ${auditPass} ${!auditPass}开始 表达式 基于以下3种表现形式组合而成 flowable:assignee"${applyUserId}" flowable:candidateUsers"${candidateUser}&qu…

js统计html页面访问的次数6,JS综合篇--[总结]Web前端常用代码片段整理

IE条件注释条件注释简介IE中的条件注释(Conditional comments)对IE的版本和IE非IE有优秀的区分能力&#xff0c;是WEB设计中常用的hack方法。条件注释只能用于IE5以上&#xff0c;IE10以上不支持。如果你安装了多个IE&#xff0c;条件注释将会以最高版本的IE为标准。条件注释的…

使用TensorFlow,GPU和Docker容器进行深度学习

摘要&#xff1a; 数据科学家使用GPU来提高TensorFlow的计算速度&#xff0c;但GPU价格昂贵&#xff0c;也需要对其所占用的资源进行认真的管理。本文将带你来一起解决这一问题。在过去的几个月中&#xff0c;我和多个企业的数据科学团队进行了多次合作&#xff0c;也看到越来越…

一键部署 Spring Boot 到远程 Docker 容器

首先构建一个简单的 Spring Boot 项目&#xff0c;然后给项目添加 Docker 支持&#xff0c;最后对项目进行部署。 文章目录一、前提条件1. SpringBoot项目2. Docker插件3. Dockerfile文件4. 服务器Docker环境5. Maven环境二、技术选型三、新建SpringBoot项目1. pom2. DockerCon…

Docker,一个傲娇的男人

戳蓝字“CSDN云计算”关注我们哦&#xff01;引言大概几个月前&#xff0c;我曾经写过一篇文章叫《微服务为什么一定要用docker》。当时&#xff0c;写完这篇以后&#xff0c;有些粉丝表示想看看基本入门教程&#xff0c;希望我写一篇。然后呢&#xff0c;大家也知道&#xff0…

英特尔核芯显卡控制面板没有了_只认性能你就输了!英特尔第十代酷睿处理器最全解析...

前不久&#xff0c;英特尔公布了第十代酷睿处理器“Ice Lake”的命名规则&#xff0c;AnandTech网站也曝光了“次旗舰”级别酷睿i7-1065G7处理器的实测性能(详见《10nm新架构Iris Plus核显 第十代酷睿到底有多强&#xff1f;》)。从结果来看&#xff0c;i7-1065G7的CPU性能提升…

阿里敏捷教练何勉:论精益思想及精益产品开发实践体系

摘要&#xff1a; 精益求精是工匠精神实现的最佳方法&#xff0c;通过引入实践精益思想的原则和方法进行精益产品开发&#xff0c;打造对客户最好的产品进行交付&#xff0c;其次通过精益思想的理念降低企业的运营成本&#xff0c;提高企业的运营效率。阿里资深解决方案架构师、…

html页面内分栏显示不全,怎么消除Word文档分栏后栏间不平衡现象

IE10浏览器打开网页鼠标不能滚动查看是怎么回事&#xff1f;IE10浏览器黑屏&#xff0c;但是滚动鼠标就好了&#xff0c;不到一分钟...在控制面板的电源设置中&#xff0c;将显示器的关闭时间调到你希望的时刻就可以了。word文档分栏后左右对不齐怎么办word文档分栏后左右对不齐…

开发经验分享_06_前端开发技巧

接上一篇&#xff1a;(企业内部)开发经验分享_05_葫芦画瓢 https://gblfy.blog.csdn.net/article/details/103414567 文章目录一、JS调试技巧1. 推荐使用consde.log2. 推荐理由3. Network正确的使用姿势①Headers一、JS调试技巧 1. 推荐使用consde.log 推荐使用consde.log(内…

Spring精华问答 | 为什么要学习Spring?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Spring是为解决企业应用程序开发复杂性而创建的一个Java开源框架&#xff0c;应用非常广泛。业内非常流行的SSH架构中的其中一个"S"指的就是Spring。今天我们就一起来看看关于Spring的精华问答&#xff01;1Q&#xff1a;…