当前位置: 首页 > news >正文

常用设计模式——策略模式

策略模式是什么

策略模式(Strategy):针对一组算法,将每一个算法封装起来,从而使得它们可以相互替换。

比如我们一个软件的会员等级,每一个等级都会有对应的一些等级权益,那么每一个等级权益就对应一个策略

结构

策略模式的通用类图如下:
在这里插入图片描述
策略模式主要由这三个角色组成,环境角色(Context)、抽象策略角色(Strategy)和具体策略角色(ConcreteStrategy)

1.上下文角色(Context):持有所有策略类的对象,可以根据策略提供相应的算法给客户端使用。
2.抽象策略角色(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。此角色提供具体策略类所需的接口。
3.具体策略角色(ConcreteStrategy):继承或实现了抽象策略,封装了相应的算法或行为。

策略模式的优缺点

优点
(1)算法可以自由切换
(2)避免使用多重条件判断
(3)扩展性良好,增加一个策略只需实现接口即可

缺点
(1)策略类数量会增多,每个策略都是一个类,复用性很小
(2)所有的策略类都需要对外暴露

使用场景

1、业务代码需要根据场景不同,切换不同的实现逻辑
2、代码中存在大量 if else 逻辑判断

实例

下面使用策略模式实现会员不同等级的权益领取

抽象策略角色:

/*** 会员抽象策略*/
public interface MemberStrategy {/*** 领取会员福利*/void getWeal();}

具体策略角色:

/*** 等级1的会员福利*/
@Component
public class LV1MemberWeal implements MemberStrategy {@Overridepublic void getWeal() {System.out.println("5元优惠券");}}/*** 等级2会员福利*/
@Component
public class LV2MemberWeal implements MemberStrategy{@Overridepublic void getWeal() {System.out.println("10元优惠券");}}

上下文角色:

我们可以使用枚举加bean工厂来定义一个上下文角色,避免上下文角色的if-else

策略枚举类

策略枚举类用于获取bean容器中的策略类class

/*** 策略枚举*/
public enum MemberEnum {LV1(LV1MemberWeal.class),LV2(LV2MemberWeal.class);;private Class clazz;MemberEnum(Class clazz) {this.clazz = clazz;}public static Class getStrategyClass(String name){return MemberEnum.valueOf(name).clazz;}}

使用ApplicationContext可以获取bean工厂中的实例,下面是对应工具类

@Component
public class ApplicationContextUtil implements ApplicationContextAware {private static ApplicationContext applicationContext;/*** 将ApplicationContext注入* @param applicationContext* @throws BeansException*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}public static ApplicationContext getApplicationContext(){return applicationContext;}/*** 根据类型获取bean* @param clazz* @param <T>* @return*/public static <T> T getBean(Class clazz){return (T) getApplicationContext().getBean(clazz);}/*** 根据名称获取bean* @param name* @param <T>* @return*/public static  <T> T getBean(String name){return (T) getApplicationContext().getBean(name);}}

上下文角色类

/*** 会员上下文角色*/
@Component
public class MemberStrategyContext {/*** 根据入参类型获取对应的策略类* @param type* @return*/public MemberStrategy getMemberStrategy(String type){MemberStrategy memberStrategy = ApplicationContextUtil.getBean(MemberEnum.getStrategyClass(type));return memberStrategy;}}

测试类

RunWith(SpringRunner.class) //作用:让当前类在容器环境下进行测试
@SpringBootTest(classes = DemoApplication.class)
public class StrategyTest {@Autowiredprivate MemberStrategyContext memberStrategyContext;@Testpublic void testStrategy(){//根据入参获取对应策略类MemberStrategy memberStrategy = memberStrategyContext.getMemberStrategy("LV2");//执行策略类的算法memberStrategy.getWeal();}}

相关文章:

常用设计模式——策略模式

策略模式是什么 策略模式&#xff08;Strategy&#xff09;&#xff1a;针对一组算法&#xff0c;将每一个算法封装起来&#xff0c;从而使得它们可以相互替换。 比如我们一个软件的会员等级&#xff0c;每一个等级都会有对应的一些等级权益&#xff0c;那么每一个等级权益就…...

牛客网 CM11.链表分割

目录 1.解题思路2.代码实现 1.解题思路 此题目思路相对简单&#xff0c;利用双指针&#xff0c;一个指针指向小于val的&#xff0c;一个指针指向大于等于val的&#xff0c;但实现起来&#xff0c;如果仅仅使用单链表&#xff0c;那么还需特别判断第一个指针是否为空从而特意做…...

[iOS开发]iOS中TabBar中间按钮凸起的实现

在日常使用app的过程中&#xff0c;经常能看到人家实现了底部分栏控制器的中间按钮凸起的效果&#xff0c;那么这是怎么实现的呢&#xff1f; 效果演示&#xff1a; 实现原理&#xff1a; 创建按钮 创建一个UITabBar的子类&#xff0c;重写它的layoutSubviews方法&#xff1…...

数字时代,企业的数据共享意味着什么?

随着数字化整体在社会方方面面的推进&#xff0c;通过数据直接或间接创造的价值越来越大&#xff0c;逐渐成为了构建现代社会的重要要素。而对于企业来说&#xff0c;数据也是在数字经济中容易接触也切实能够利用产生大量价值&#xff0c;所以如何最大化利用数据&#xff0c;让…...

壹[1],QT自定义控件创建(QtDesigner)

1&#xff0c;环境 Qt 5.14.2 VS2022 原因&#xff1a;厌烦了控件提升的繁琐设置&#xff0c;且看不到界面预览显示。 2&#xff0c;QT制作自定义控件 2.1&#xff0c;New/其他项目/Qt4 设计师自定义控件 2.2&#xff0c;设置项目名称 2.3&#xff0c;设置 2.4&#xff0c;设…...

解决Java对接LDAP AD域登录出现Unprocessed Continuation Reference(s)错误

出现该错误的原因&#xff0c;主要是因为Java namingx的库&#xff0c;默认选项是未设置跟随&#xff0c;389返回的是AD域条目的引用&#xff0c;需要进行引用跟随。 解决方法分为两种&#xff0c;第一类不使用全局目录服务的端口389和636&#xff0c;而是使用真实端口 把代码…...

could not read ok from ADB Server

执行adb devices提示 List of devices attached * daemon not running; starting now at tcp:5037 could not read ok from ADB Server * failed to start daemon 方法1&#xff0c;关闭防火墙&#xff0c; could not read ok from ADB Server_夜星辰2023的博客-CSDN博客 我…...

超越基础:Flutter 中 onTap 的 5 条规则让你脱颖而出

小事情决定了你的熟练程度&#xff0c;这些小细节的有趣之处在于它们的丰富性。您将在代码库中的数百个位置遇到 onTap 事件。增强它们可以对代码的可维护性和最终用户体验产生重大的积极影响。 onTap 就是这样一个微小但丰富的东西——我们在每个屏幕上都使用它。这纯粹是关于…...

综合布线可视化管理系统价值分析

传统综合布线管理&#xff0c;全部依靠手工登记&#xff0c;利用标签标示线缆&#xff0c;利用文档资料记录链路的连接和变更&#xff0c;高度依赖网络管理员的管理能力&#xff0c;维护效率低下。同时&#xff0c;网络接入故障和非法接入难以及时发现。在以往的文章中小编一直…...

【JavaSE】基础笔记 - 类和对象(上)

目录 1、面向对象的初步认知 1.1、什么是面向对象 1.2、面向对象与面向过程 2. 类定义和使用 2.1、简单认识类 2.2、类的定义格式 2.3、自定义类举例说明 2.3.1、定义一个狗类 2.3.2、定义一个学生类 3、类的实例化 3.1、什么是实例化 3.2、类和对象的说明 1、面向…...

浅谈开口互感器在越南美的工业云系统中的应用

摘 要&#xff1a;分析低压开口式电流互感器的原理&#xff0c;结合工程实例分析开口电流互感器在低压配电系统中&#xff0c;主要是改造项目中的应用及施工细节&#xff0c;为用户快速实现智能配电提供解决方案&#xff0c;该方案具有成本低、投资少、安装接线简便等优点&…...

docker的使用以及注意事项

ssh的登录 1.登录ssh ssh 用户名IP地址 2.生成密钥 ssh-keygen生成密钥&#xff0c;在.ssh文件夹中&#xff08;如果没有自己生成一个&#xff09; 如果密钥之前已经生成过&#xff0c;可能在配置git的时候&#xff0c;会报错:这个密钥已经使用过的报错 解决方法是:otherwise[…...

大数据之LibrA数据库系统告警处理(ALM-12027 主机PID使用率超过阈值)

告警解释 系统每30秒周期性检测PID使用率&#xff0c;并把实际PID使用率和阈值进行比较&#xff0c;PID使用率默认提供一个阈值。当检测到PID使用率超出阈值时产生该告警。 平滑次数为1&#xff0c;主机PID使用率小于或等于阈值时&#xff0c;告警恢复&#xff1b;平滑次数大…...

软考 系统架构设计师系列知识点之数字孪生体(3)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之数字孪生体&#xff08;2&#xff09; 所属章节&#xff1a; 第11章. 未来信息综合技术 第5节. 数字孪生体技术概述 3. 数字孪生体的关键技术 建模、仿真和基于数据融合的数字线程是数字孪生体的三项核心技术。能够做…...

新闻稿的写作注意事项!纯干货

新闻稿是企业、机构、政府等组织向公众传递信息的重要途径之一&#xff0c;也是媒体获取新闻素材的主要来源。一篇优质的新聞稿不仅可以吸引读者的注意力&#xff0c;还可以提高组织的形象和声誉。因此写好新闻稿至关重要。下面伯乐网络传媒来给大家探讨一些新闻稿写作的注意事…...

Android开发知识学习——从Retrofit原理来看HTTP

文章目录 Retrofit 使用方法简介Retrofit 源码结构总结扔物线读源码的思路与方式 Retrofit 使用方法简介 导包 implementation com.squareup.retrofit2:retrofit:最新版本创建一个 interface 作为 Web Service 的请求集合&#xff0c;在里面用注解 &#xff08;Annotation&…...

计算机毕设 基于大数据的抖音短视频数据分析与可视化 - python 大数据 可视化

文章目录 0 前言1 课题背景2 数据清洗3 数据可视化地区-用户观看时间分界线每周观看观看路径发布地点视频时长整体点赞、完播 4 进阶分析相关性分析留存率 5 深度分析客户价值判断 5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;…...

1.OpenResty系列之入门简介

OpenResty&#xff08;也称为ngx_openresty&#xff09;是一个基于Nginx的全功能Web应用服务器&#xff0c;它将Nginx与一组附加模块和Lua脚本语言集成在一起&#xff0c;以提供高性能的Web应用程序开发和扩展性。 Nginx是一个轻量级的、高性能的HTTP服务器和反向代理服务器&a…...

Trie树(字典树)

原理&#xff1a; 1. ch[p][j]:p是每个单词存到的idx索引&#xff0c;j是存入字符映射的数字 2. cnt[p] 存这个单词个数 【模板】字典树 - 洛谷 #include <iostream> #include <cstring> using namespace std;const int N 3e6 10; int ch[N][100], idx; int cnt…...

华为政企网络安全产品集

产品类型产品型号产品说明 防火墙及应用安全网关ASG5505ASG5000系列上网行为管理产品&#xff08;以下简称“ASG5000”&#xff09;是华为面向各类企业、政府、大中型数据中心以及各类无线非经营性场所推出的业界领先的综合上网行为管理产品。 该系列产品可深度识别、管控和…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...