最容易懂的策略模式消除if-else分支,实现开闭原则,提高可扩展性
1 介绍
策略模式最常用的场景就是用于消除代码中的if-else,这里所说的if-else并不是说任何简单的判断都引入策略模式来优化,这样反而会增加代码的复杂度。
反例:使用策略模式对一个boolean类型的变量进行优化
2 背景
我负责的有一个基于流程引擎开发的项目,有一个功能模块是查看申请单的详情,由于不同的申请单展示的信息各不相同,最开始负责这部分功能开发的同学使用if-else来判断申请单的类型,并对不同的申请单做不同的处理。
由于系统中的申请单越来越多,这部分的if-else分支也变得臃肿,而且每次新增申请单的时候,都需要在后面再加一个分支,不仅破坏了开闭原则,而且可读性极差,也不利于扩展。

3 引入策略接口

不同的申请单有自己处理detail的逻辑,实现这个策略接口,重写 doDetail()即可
这是一个默认实现:

4 引入策略上下文对象
有了策略接口后,现在需要一个上下文对象将所有的策略放在一个集合中,方便后续调用

这里使用了 spring 框架提供的 applycationContext 来获取策略接口的所有实现类,在策略上下文对象完成初始化后,将实现类注册到 map 中。(@PostConstruct:在bean初始化完成后处理一些逻辑)
5 客户端调用
只要持有 策略上下文对象,就能拿到策略接口的实现类,从而执行相关逻辑:

6 总结
后续开发的同学添加申请单的时候,只需要新增一个详情类,实现策略接口,重写方法即可,大大提高了这部分功能的扩展性。
关于策略上下文对象使用集合存储所有策略的解释:使用 Map 来存储,需要一个key来标识使用哪种策略来处理。
最容易懂的策略模式消除if-else分支,实现开闭原则,提高可扩展性的更多相关文章
- Head First 设计模式 --3 装饰者模式 开闭原则
装饰者模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比集成更有弹性的替代方案.设计原则:1:封装变化2:多用组合,少用继承3:针对接口编程,不针对实现编程4:为对象之间的松耦合设计而努力5 ...
- 设计模式 第一天 UML图,设计模式原则:开闭原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则,简单工厂模式
1 课程大纲 2 UML的概述 总结: UML unified model language 统一建模语言 一共有十种图: 类图 用例图 时序图 * 对象图 包图 组件图 部署图 协作图 状态图 (最 ...
- C#设计模式系列:策略模式(Strategy)
1.策略模式简介 1.1>.定义 策略是为达到某一目的而采取的手段或方法,策略模式的本质是目标与手段的分离,手段不同而最终达成的目标一致.客户只关心目标而不在意具体的实现方法,实现方法要根据具体 ...
- 设计模式笔记:策略模式(Strategy)
1. 策略模式简介 1.1 定义 策略是为达到某一目的而采取的手段或方法,策略模式的本质是目标与手段的分离,手段不同而最终达成的目标一致.客户只关心目标而不在意具体的实现方法,实现方法要根据具体的环境 ...
- Strategy 策略模式 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 设计模式---组件协作模式之策略模式(Strategy)
一:概念 Strategy模式,对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略). Strategy模 ...
- js-设计模式学习笔记-策略模式
策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换(相互替换:表现为它们具有相同的目标和意图). 策略模式的目的是讲算法的使用与算法的实现分离开来. 一个基于策略模式的程 ...
- 转-PHP 设计模式 之策略模式 应用场景 Strategy Pattern
一.前言 关于设计模式的文章,园子里实在是太多太多,而且讲解的也非常精彩,那为什么我还要在这里记录下这篇文章?本文以实际项目应用“自己动手写工具--XSmartNote”为切入点,来讲述策略模式的应用 ...
- 设计模式(Python)-策略模式
本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...
- java线程基础巩固---策略模式在Thread和Runnable中的应用分析
在上篇[http://www.cnblogs.com/webor2006/p/7709647.html]中已经学习了Runnable出现的好处,其实这种设计是采用的一种策略模式,所以为了进一步理解Ru ...
随机推荐
- ysoserial CommonsCollections2 分析
在最后一步的实现上,cc2和cc3一样,最终都是通过TemplatesImpl恶意字节码文件动态加载方式实现反序列化. 已知的TemplatesImpl->newTransformer()是最终 ...
- JS逆向实战2--cookie-AcwScV2加密—某招标信息网
cookies的获取 首先拿到第一次访问原链接 拿到acw_tc的值,然后放到session中去 再用这个session再次访问原链接拿到js加载的加密的真实数据.用了一些反混淆. 最后获取这个数据中 ...
- 【翻译】Thymeleaf – Spring Security集成模块
原文链接:Thymeleaf - Spring Security integration modules 来源:thymeleaf/thymeleaf-extras-springsecurity自述文 ...
- 利用KubeEdge在A500部署边缘推理任务
利用KubeEdge在A500部署边缘推理任务 目 录 1 环境介绍... 1 2 云端环境部署... 2 2.1 在master节点安装Docker和k8S (ubuntu) 2 2.1.1 ...
- Go语言核心36讲03
[Go语言代码较多,建议配合文章收听音频.] 你好,我是郝林.从今天开始,我将和你一起梳理Go语言的整个知识体系. 在过去的几年里,我与广大爱好者一起见证了Go语言的崛起. 从Go 1.5版本的自举( ...
- 2、两个乒乓球队,甲队有a,b,c三名队员,乙队有d,e,f三名队员,甲队a不愿和d比赛,c不愿意和d,f比赛,求合适的赛手名单
/*两个乒乓球队,甲队有a,b,c三名队员,乙队有d,e,f三名队员,甲队a不愿和d比赛,c不愿意和d,f比赛,求合适的赛手名单 */ #include <stdio.h> #includ ...
- Zookeeper的服务器的log4j升级为log4j2的升级方案(忽略配置化兼容问题)
参考在线markdown编辑器: http://marxi.co/ Zookeeper的服务器的log4j升级为log4j2的升级方案(忽略配置化兼容问题) 目前希望可以升级将Zookeeper中lo ...
- 【JVM调优】Day02:CMS的三色标记算法、分区的G1回收器、短时停顿的ZGC回收器
一.CMS及其三色标记算法 1.核心 标记整个图谱的过程分为多步 多个线程相互工作,才能标记完 标记的算法,JVM虚拟机.go语言使用的都是三色标记算法 2.含义 从那个地方开始,用三种颜色替代 一开 ...
- org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents
异常:org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to b ...
- 你不知道的Map家族中的那些冷门容器
概述 本篇文章主要讲解下Map家族中3个相对冷门的容器,分别是WeakHashMap.EnumMap.IdentityHashMap, 想必大家在平时的工作中也很少用到,或者压根不知道他们的特性以及适 ...