java的策略模式_Java中使⽤策略模式
⼀、问题引⼊
当我们导出⼀些数据到Excel表格时,有时候需要从不同的维度导出(如:个⼈维度,时间维度),不同维度所需的处理⽅式不同,此时的场景很适合⽤策略模式,下⾯就以不同维度导出Excel表格为例介绍策略模式。
⼆、策略模式概念和理论知识
2.1,策略模式的概念
在策略模式(Strategy Pattern)中,⼀个类的⾏为或其算法可以在运⾏时更改。我们创建表⽰各种策略的对象和⼀个⾏为随着策略对象改变⽽改变的 context 对象。策略对象改变 context 对象的执⾏算法。
策略模式是⼀种⾏为模式,也是替代⼤量 if...的利器。它所能帮你解决的是场景,⼀般是具有同类可替代的⾏为逻辑算法场景。例如:不同类型的交易⾏式(信⽤卡、⽀付宝、)、⽣成唯⼀ID策略 (UUID、DB⾃增、DB+Redis、雪花算法、Leaf算法)等,都可以使⽤策略模式进⾏⾏为包装,供给外部使⽤。
2.2,策略模式类图
(图⽚取⾃百度百科)
2.3,策略模式的优缺点
优点是:1,降低耦合性;2,代替if...,避免使⽤多重条件判断;3,符合开闭原则,扩展性良好。
缺点是: 1、策略类会增多。 2、所有策略类都需要对外暴露。
三、策略模式的应⽤
业务场景:假设⼀个问卷系统收集了很多⽤户的答卷,现在需要从两个维度导出⽤户答卷,分别是:⽤户维度,时间维度。
我们⾸先创建⼀个抽象策略类:BaseExportHandler
1 /**
2 * @Version V1.0.0
3 * @Description 数据导出抽象策略类
4 */
5 public abstract classBaseExportHandler {6
7 /**
8 * 导出9 *10 *@paramstartTime 开始时间11 *@paramendTime 结束时间12 *@paramuserId 问卷Id13 */
14 public abstract Boolean doExport(Date startTime, Date endTime, Long userId);15 }
抽象策略类中有⼀个抽象⽅法:doExport(),定义⼀下导出⽅法。
然后创建⽤户维度导出策略类:UserExportHandler,时间维度导出策略类:TimeExportHandler,这两个类是抽象策略类的实现
1 /**
2 * @Version 1.0
3 * @Description 个⼈维度导出策略
4 */
5 public class UserExportHandler extendsBaseExportHandler {
6 /**
7 * 导出8 *9 *@paramstartTime 开始时间10 *@paramendTime 结束时间11 *@paramuserId 问卷Id12 */
13 @Override14 publicBoolean doExport(Date startTime, Date endTime, Long userId) {15 System.out.println("个⼈维度导出成功...");16 return true;17 }18 }
/*** @Version 1.0
* @Description 时间维度导出策略*/
public class TimeExportHandler extendsBaseExportHandler {/*** 导出
*
*@paramstartTime 开始时间
*@paramendTime 结束时间
*@paramuserId 问卷Id*/@OverridepublicBoolean doExport(Date startTime, Date endTime, Long use
rId) {
System.out.println("时间维度导出成功...");return null;
}
}
创建⼀个枚举:ExportTypeEnum
1 /**
2 * @Version 1.0
3 * @Description 导出类型枚举
4 */
5 public enumExportTypeEnum {
6 User(SimpleName(), newUserExportHandler()),7
Time(SimpleName(), newTimeExportHandler())8 ;9
10 private finalString exportType;11 private finalBaseExportHandler exportHandler;12 ExportTypeEnum(String exportType, BaseExportHandler exportHandler) {portType =exportType;portHandler =exportHandler;15 }16
17 /**
18 * 匹配19 */
20 public staticExportTypeEnum match(String exportType) {21 ExportTypeEnum[] values =ExportTypeEnum.values();22
for(ExportTypeEnum typeEnum : values) {23 portType.equals(exportType)) {24 returntypeEnum;25 }26 }27 return null;28 }29
30 publicString getExportType() {31 returnexportType;32 }33
34 publicBaseExportHandler getExportHandler() {35 returnexportHandler;36 }37 }
创建⼀个测试,我们试⼀下
java技术介绍百度百科
1 public classTestExport {
2 public static voidmain(String[] args) {
3 String exportType =
SimpleName();4 ExportTypeEnum typeEnum =ExportTypeEnum.match(exportType);5 BaseExportHandler exportHandler =ExportHandler();6 if (exportHandler != null) {7
exportHandler.doExport(new Date(), new Date(), 1L);8 }9 }10 }
输出
1 时间维度导出成功 (2)
3 Process finished with exit code 0
通过使⽤策略模式,替换了if...从⽽使得不同策略之间不需要融合到⼀起,防⽌其中⼀个策略出问题后影响其它策略,同时提⾼了系统整体的可扩展性,最⼤程度上实现开闭原则。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。