java的优雅就在于设计模式

每天各种谈论设计模式,可是在日常写代码中,仍然是crud boy,那么我们如何使用设计模式运用在日常工作中呢。

本文使用策略工厂模式进行去除冗杂的if-else语句,让工作中的代码看起来更加优雅。

先叙述场景,在监控告警系统中,往往需要通过多种通道向告警成员发送警报,例如:企业微信告警,手机短信告警,邮箱告警,语音告警等多种告警方式。
那么我们最初的做法是什么呢?

 public interface AlertWayService {void call(String recevier,Alert alert, String title);}

定义一个发送告警的接口,然后通过判断是那种告警方式,选择调用哪个service实现类。
代码如下:

String alertWay = null;if("weChat".equals(alertWay)){//调用微信接口实现类发送微信}else if ("sms".equals(alertWay)){//短信}else if("email".equals(alertWay)){//邮箱}else if("voice".equals(alertWay)){//语音}

这样的代码仿佛结构清晰,一眼看懂,但是其弊端也非常明显

1.代码拓展性不强,如果要加入一个新的通道方式,极其不方便。
2.大量的if-else语句使得代码阅读难度较高。
3.代码逻辑性不强。
4.在code-review环节容易被喷。

那么我们如何优雅的通过设计模式解决这种冗杂代码呢?

这里我们使用策略工厂模式进行解决。

先上代码

public class AlertServiceStrategyFactory {private static Map<String, AlertWayService> services = Maps.newConcurrentMap();public static AlertWayService getAlertWay(String alertWay) {return services.get(alertWay);}public static void register(String alertWay, AlertWayService alertWayService) {if (Assert.StringAssert.isNotEmpty(alertWay)) {services.put(alertWay, alertWayService);}}
}

这里我们使用策略工厂进行注册通道和通道接口。

通过Map进行存储通道字段和通道接口,并进行绑定。

通道接口还是那个接口

public interface AlertWayService {void call(String recevier,Alert alert, String title);}

关键在实现类中。

@Service
@Slf4j
public class EmailAlertWayServiceImpl implements AlertWayService, InitializingBean {@Autowiredprivate InnerNoticeClient innerNoticeClient;@Overridepublic void call(String recevier,Alert alert, String title) {innerNoticeClient.callEmile(recevier, WeChatTemplate.getEmileTmpl(alert,title),alert.getStatus());}@Overridepublic void afterPropertiesSet() {AlertServiceStrategyFactory.register(NotificationTypeEnums.EMAIL.getValue(),this);}
}

service实现类中实现了InitializingBean接口,并在afterpropertiesSet中进行注册绑定通道和通道接口,通过register让AlertServiceStrategyFactory中的services这个map初始化了四种通道方式。

InitializingBean接口的详细使用可以参考其他优秀的博客。

当我们完成了这一系列的定义后,那么我们如何使用呢?

 alertWay.forEach((k1) -> AlertServiceStrategyFactory.getAlertWay(k1).call(v,alert, titleOfTreeInfo));

这里通过遍历alertWay的方式进行获取通道,调用AlertServiceStrategyFactory中的getAlertWay方法 通过alertWay中定义的通道形式,有策略的进行调用相应的通道接口,实现了优雅的使用策略工厂模式进行有效的去除if-else。

end

优雅的代码往往只需要几行…

代码优雅之路-如何优雅的去除冗杂的if-else语句相关推荐

  1. Android RecyclerView、ListView实现单选列表的优雅之路.

    一 概述: 这篇文章需求来源还是比较简单的,但做的优雅仍有值得挖掘的地方. 需求来源:一个类似饿了么这种电商优惠券的选择界面:  其实就是 一个普通的列表,实现了单选功能,  效果如图:    (不要 ...

  2. Python代码如何写的更优雅

    首先最重要的一点, 忘掉其他语言里的写法, 尝试使用Python风格进行code, 熟练之后,你会觉得她真的很美! 1. 多个值进行初始化 # > yes s1,s2,s3 = [],[],0 ...

  3. google python代码规范_Python代码这样写才规范优雅! (二)

    前文传送门:Python代码这样写才规范优雅! (一)参考:https://www.python.org/dev/peps/pep-0008/Python PEP8编码规范的内容如下: 1. Intr ...

  4. 代码精进之路:从码农到工匠读书笔记

    代码精进之路:从码农到工匠读书笔记 第一章技艺 代码命名规范的意义: 由此可见,事物的复杂程度在很大程度上取决于其有序程度,减少无序能在一定程度上降低复杂度,这正是规范的价值所在.通过规范,把无序的混 ...

  5. 代码重构之路 --我的2022年总结

    2022年是我正式参加工作的第10个年头,也是我在CSDN上写博客的第11个年头.在这10余年的时间里,虽然在工作上遇到了各种情况,但我一直坚持输出.坚持分享,一共在CSDN上发表了530多篇原创博文 ...

  6. 代码精进之路读后感(三)

    继续拜读范老师的代码精进之路,越读越觉得虽然短小但是很精悍,别想歪,我们说的是正经事 第三篇范老师讲了讲什么是优秀的程序员,我觉得就是我啊,会打代码还会吹牛逼扯犊子,还会说几句相声扯几嗓子小曲,别打了 ...

  7. #华为云·寻找黑马程序员#【代码重构之路】如何优雅的关闭外部资源

    1.背景 在Java编程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编 ...

  8. eplices如何导入外部代码_#华为云·寻找黑马程序员#【代码重构之路】如何优雅的关闭外部资源...

    1.背景 在Java编程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编 ...

  9. Python爬虫还在写重试代码?快快学习下优雅的tenacity库!

    前言 在爬虫过程中,经常会由于一些网络或其他不可控因素,从而遇到一些功能性问题.比如在发送请求时,会因为网络不稳定,往往会有请求超时的问题.这种情况下,我们通常会在代码中加入重试的代码.重试的代码本身 ...

最新文章

  1. [转]使用 C 编写 Lua 模块
  2. springboot整合vue小试牛刀
  3. Java 技术篇-IntelliJ IDEA修改类名后运行提示找不到或无法加载主类问题解决方法
  4. stm8s003程序跑飞_A股要大跌?跑不跑就看明天……
  5. 研究生念了些什么东西?
  6. 微信时代计算机教学,互联网+时代技工院校计算机教学方式研究
  7. yum 安装oraclejdk_四、CentOS 7安装Oracle JDK
  8. linux下进程调度算法实验,Linux下进程调度算法的模拟实现.doc
  9. 4月上旬中国万网域名总量增至245.8万个 国内份额上扬
  10. Nacos 启动报错 Unable to start embedded Tomcat
  11. leslie模型matlab代码6,Leslie_model
  12. 报表开发工具FastReport开源代码2020首发更新!邀您免费下载
  13. openwrt 如何打patch补丁
  14. 范浩强平衡树(FHQ_Treap)介绍
  15. C语言中 各数据类型求绝对值abs(),fabsf()等函数的使用。
  16. RTX用户帮助中心群:177262328
  17. linux中默认文件666和目录777的权限关系
  18. 素数筛线性筛详细详解(个人总结思路超长版)
  19. 大数据核心32个算法技术
  20. paper_note

热门文章

  1. 有关智能操作系统的讨论
  2. 人工智能基础 | 机器学习介绍(一)
  3. Delphi XE7 发布了
  4. pinctrl和gpio子系统
  5. 快手2020实习生招聘---测试类--笔试真题
  6. 2021.1山科马原大题
  7. 光电信息科学与工程可以考计算机研究生吗,光电信息科学与工程专业考研方向...
  8. 【论文查询】如何查询论文被其他哪些文献引用过?超详细!!!
  9. cad怎么去除drawing1_如何设置cad2012打开已有的DWG图纸的时候不自动新的Drawing1窗口?...
  10. 更1多免费源码668源码网.html,某宝在线客服源码含详细教程