Java 设计模式——策略模式(行为型设计模式)

article/2025/10/4 12:44:30

策略模式用我个人的理解就是:
用一种更灵活更优雅和更健壮的方式替换了if…else…

一、问题引入

当我们导出一些数据到Excel表格时,有时候需要从不同的维度导出(如:个人维度,时间维度),不同维度所需的处理方式不同,此时的场景很适合用策略模式,下面就以不同维度导出Excel表格为例介绍策略模式。

二、策略模式概念和理论知识

2.1,策略模式的概念

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

策略模式是一种行为模式,也是替代⼤量 if…else…的利器。它所能帮你解决的是场景,一般是具有同类可替代的行为逻辑算法场景。例如:不同类型的交易行式(信用卡、支付宝、微信)、生成唯一ID策略 (UUID、DB自增、DB+Redis、雪花算法、Leaf算法)等,都可以使用策略模式进行行为包装,供给外部使用。

2.2,策略模式类图

在这里插入图片描述

2.3,策略模式的优缺点

优点是:1,降低耦合性;2,代替if…else…,避免使用多重条件判断;3,符合开闭原则,扩展性良好。

缺点是: 1、策略类会增多。 2、所有策略类都需要对外暴露。

三、策略模式的应用

业务场景:假设一个问卷系统收集了很多用户的答卷,现在需要从两个维度导出用户答卷,分别是:用户维度,时间维度。

我们首先创建一个抽象策略类:BaseExportHandler

/*** @Version V1.0.0* @Description 数据导出抽象策略类*/
public abstract class BaseExportHandler {/*** 导出** @param startTime 开始时间* @param endTime   结束时间* @param userId    问卷Id*/public abstract Boolean doExport(Date startTime, Date endTime, Long userId);
}

抽象策略类中有一个抽象方法:doExport(),定义一下导出方法。

然后创建用户维度导出策略类:UserExportHandler,时间维度导出策略类:TimeExportHandler,这两个类是抽象策略类的实现

/*** @Version 1.0* @Description 个人维度导出策略*/
public class UserExportHandler extends BaseExportHandler {/*** 导出** @param startTime 开始时间* @param endTime   结束时间* @param userId    问卷Id*/@Overridepublic Boolean doExport(Date startTime, Date endTime, Long userId) {System.out.println("个人维度导出成功...");return true;}
}
/*** @Version 1.0* @Description 时间维度导出策略*/
public class TimeExportHandler extends BaseExportHandler {/*** 导出** @param startTime 开始时间* @param endTime   结束时间* @param userId    问卷Id*/@Overridepublic Boolean doExport(Date startTime, Date endTime, Long userId) {System.out.println("时间维度导出成功...");return null;}
}

创建一个枚举:ExportTypeEnum

/*** @Version 1.0* @Description 导出类型枚举*/
public enum ExportTypeEnum {User(UserExportHandler.class.getSimpleName(), new UserExportHandler()),Time(TimeExportHandler.class.getSimpleName(), new TimeExportHandler());private final String exportType;private final BaseExportHandler exportHandler;ExportTypeEnum(String exportType, BaseExportHandler exportHandler) {this.exportType = exportType;this.exportHandler = exportHandler;}/*** 匹配*/public static ExportTypeEnum match(String exportType) {ExportTypeEnum[] values = ExportTypeEnum.values();for (ExportTypeEnum typeEnum : values) {if (typeEnum.exportType.equals(exportType)) {return typeEnum;}}return null;}public String getExportType() {return exportType;}public BaseExportHandler getExportHandler() {return exportHandler;}
}

创建一个测试,我们试一下

public class TestExport {public static void main(String[] args) {String exportType = UserExportHandler.class.getSimpleName();ExportTypeEnum typeEnum = ExportTypeEnum.match(exportType);BaseExportHandler exportHandler = typeEnum.getExportHandler();if (exportHandler != null) {exportHandler.doExport(new Date(), new Date(), 1L);}}
}

输出

1 时间维度导出成功…
2
3 Process finished with exit code 0

通过使用策略模式,替换了if…else…从而使得不同策略之间不需要融合到一起,防止其中一个策略出问题后影响其它策略,同时提高了系统整体的可扩展性,最大程度上实现开闭原则。

在Java8中使用策略模式举例:

java.lang.CharacterData类,这个类使用的就是策略模式,其static final CharacterData of(int ch)方法是策略逻辑方法,

java.lang.Character类是CharacterData类的调用类,具体使用的方法可参考 isWhitespace()、getType()等方法。


http://chatgpt.dhexx.cn/article/i61BfbHr.shtml

相关文章

采用注解实现策略模式

目录 一、前言 二、采用简单的注解方式进行业务策略模式 (一)场景举例 (二)实现方案 1、基本代码准备 2、基本功能接口定义 3、定义注解与不同的策略实现 4、业务实际使用 5、测试及结果展示 三、采用组合的注解方式进行…

​JAVA设计模式(六)——策略模式

下图为所有设计模式,带标记为重点掌握以及工作中常用到的: 策略模式是行为型设计模式之一,其作用是让一个类的行为或其算法可以在运行时更改,该模式也算是我比较熟悉的模式之一了,因为之前项目中有幸遇到大佬用过&…

java 策略模式例子_策略模式—Java实现(转)

1. 现实需求 客户有了新的需求,这时我们直接新增策略即可,改很少的代码。基本符合我们面向对象原则中的开闭原则(对扩展开放,对修改关系),实现了高内聚低耦合。 2. 策略模式定义 策略模式,又叫算法簇模式,就…

Java设计模式(五)策略模式-在SpringBoot项目中的实际应用

文章目录 什么是策略模式优点缺点使用场景结构图 策略模式的简单示例策略模式的项目实战场景实现 小结 什么是策略模式 官话:策略模式(Strategy Pattern): 定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换&#xff…

java调用微信加密_java微信消息加解密

今天心血来潮就信手拈来学了下微信消息加解密的知识,忽然觉得微信真的好强大。可能在大部分项目微信消息的加解密都用不上,但是仍然不排除有使用到的情况,如涉及金钱方面的微信应用包括商城类、金融类还有其他安全级别要求很高的微信应用。针对这些情况我觉得还是有必要分享…

spring如何使用策略模式

这里使用登录做例子介绍如何实现登录的多种策略 上图是策略模式的基础模型。 context Context上下文角色,也叫Context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。 Strategy 策略角色…

java设计模式实战-(反射+策略模式)

学完23种设计模式,相信很多同学都疑问,除了单例模式、工厂模式其他模式还有运用的场景吗? 现在这里就举一个例子。 首先策略模式需要先有了解,我们常用策略模式解决实际开发中的if else特别多的场景。但是在实际的开发中&#x…

Java23种设计模式之策略模式【普通写法以及spring中的写法】

目录 设计模式简介策略模式的简介普通写法案例基于注解式改造的案例优缺点策略模式的使用场景 设计模式简介 将设计者的思维融入大家的学习和工作中,更高层次的思考! • 创建型模式: – 单例模式、工厂模式、抽象工厂模式、建造者模式、原型…

Java设计模式-策略模式(支付业务的优化)

一、什么情况下使用策略模式 功能类似的业务功能,避免创建多个接口,大量if else 判断逻辑,简化代码 二、我以支付为例(支付方式有微信,支付宝支付) 1、新建策略抽象类或者接口 public interface ThirdP…

java策略模式实战示例

现已放在gitee上,可以不下载直接参考一下即: https://gitee.com/zhang-xiao-xiang/zxx-pattern 日常碰到的业务概述 登录类型,支付类型,供应商渠道,不同等级会员享受的优惠券价格不一样,等等业务判断,大量if else导致拓展(侧重新增)极其困难,维护(侧重修改)自然是改起来头痛(…

【JAVA设计模式】策略模式

1.什么是策略模式? 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,相同的事情-----选择不用同方式 (不同实现)举例子,最终可以实现解决多重if判断问题。 …

java微信关注事件_java策略模式在接收微信事件推送上的具体应用

java策略模式,在我的认知中是根据不同选择执行不同的实现。通过if或者switch-case也能实现这种逻辑,但是代码冗余,可扩展性不强。 百度百科上的解释为策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景…

Java设计模式之3种策略模式实现

一、什么是策略模式 所谓策略模式,就是定义了一组策略,分别封装在不同类中,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者。比如我们要去某个地方,会根据距离的不同来选择不同的出行方式&…

java8 策略模式_JAVA设计模式之策略模式

策略模式:在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对…

git如何提交代码

代码提交 代码提交一般有五个步骤: 1.查看目前代码的修改状态 2.查看代码修改内容 3.暂存需要提交的文件 4.提交已暂存的文件 5.同步到服务器 1. 查看目前代码的修改状态 提交代码之前,首先应该检查目前所做的修改,运行git status命令 a)…

修改git提交时间

问题描述: 修改git提交记录的时间 git脚本: 此方法使用github上的开源工具完成。感谢无私的奉献者! 操作步骤: github上下载文件 解压文件夹,把git-redate文件置于git安装目录的\mingw64\libexec\git-core文件夹…

git提交时常用命令

git提交时常用命令 一、git命令 -- 本地仓库与远程仓库建立链接 git init (初始化本地仓库) git remote add origin 远程仓库网址 git remote -v (查看远程仓库) git remote rm origin (删除远程分支)-- checkout多种用法 git checkout 文件名 &#…

git提交分支

1. git提交分支相关 在本地新建分支,保证和远程分支一样 git checkout -b 分支名如果分支已存在,只需要切换的话 git checkout 分支名提交前先把代码拉下来更新一下,确保不会覆盖别人的代码 git pull origin 远程分支(如果有)解决冲突 git …

Git 的提交

1 提交对象 理解Git分支,就需要了解提交及在提交过程中产生的提交对象(commit object)。在进行提交时Git会存储一个提交对象,其中包含一个指针,它指向此次提交时暂存内容的快照。除此之外,提交对象中还包含…

git代码提交

代码提交 代码提交一般有五个步骤: 1.查看目前代码的修改状态 2.查看代码修改内容 3.暂存需要提交的文件 4.提交已暂存的文件 5.同步到服务器 1. 查看目前代码的修改状态 提交代码之前,首先应该检查目前所做的修改,运行git status命令 a…