策略模式是一种行为设计模式

策略模式是一种行为设计模式,允许你定义一系列算法、封装每一个算法,并使它们可以相互替换。

策略模式使得算法的变化独立于使用算法的客户端。以下是一个用策略模式实现不同类型促销活动的 Java 示例。

步骤

定义促销策略接口:创建一个接口,定义促销活动的方法。
实现具体策略:根据不同的促销活动实现该接口。
上下文类:创建一个上下文类,用于设置和执行具体的促销策略。
客户端代码:使用上下文类和不同的促销策略。

1. 定义促销策略接口

public interface PromotionStrategy {void applyPromotion();
}
  1. 实现具体促销策略
// 满减促销
public class FullReductionStrategy implements PromotionStrategy {@Overridepublic void applyPromotion() {System.out.println("Apply full reduction: Spend \$100, get \$20 off.");}
}// 打折促销
public class DiscountStrategy implements PromotionStrategy {@Overridepublic void applyPromotion() {System.out.println("Apply discount: Get 15% off on all items.");}
}// 限时促销
public class LimitedTimeStrategy implements PromotionStrategy {@Overridepublic void applyPromotion() {System.out.println("Limited time offer: Buy 2 get 1 free!");}
}

3.管理类

public class PromotionContext {private PromotionStrategy promotionStrategy;public PromotionContext(PromotionStrategy promotionStrategy) {this.promotionStrategy = promotionStrategy;}public void setPromotionStrategy(PromotionStrategy promotionStrategy) {this.promotionStrategy = promotionStrategy;}public void executePromotion() {promotionStrategy.applyPromotion();}
}
  1. 主类
public class Main {public static void main(String[] args) {// 使用满减促销PromotionContext promotionContext = new PromotionContext(new FullReductionStrategy());promotionContext.executePromotion();// 更改为打折促销promotionContext.setPromotionStrategy(new DiscountStrategy());promotionContext.executePromotion();// 更改为限时促销promotionContext.setPromotionStrategy(new LimitedTimeStrategy());promotionContext.executePromotion();}
}

运行结果
运行上述代码,将会输出以下内容:


Apply full reduction: Spend \$100, get \$20 off.
Apply discount: Get 15% off on all items.
Limited time offer: Buy 2 get 1 free!

PromotionStrategy:这是一个策略接口,定义了一个applyPromotion方法,具体的促销策略将实现这个接口。
具体策略类:FullReductionStrategy、DiscountStrategy和LimitedTimeStrategy是不同的促销策略的具体实现。
PromotionContext:上下文类,它持有一个策略的引用并提供一个方法来执行这个策略。 Main
类:客户端代码,它创建了一个上下文并使用不同的促销策略执行促销活动。

优点

1.提高了灵活性:

策略模式使得算法可以独立于使用它的客户端而变化。你可以在运行时动态地更换策略,无需修改客户端代码。

2.清晰的职责分离:

每种策略都封装在自己的类中,符合单一职责原则。这样,可以将复杂的逻辑从客户端分离出来,增强了代码的可维护性。

3.可扩展性强:

新的策略可以通过创建新的策略类来添加,而不需要修改现有的代码。这符合开闭原则,即对扩展开放,对修改关闭。

4.简化了复杂的条件语句:

使用策略模式可以消除复杂的条件语句(如 if…else 或 switch),使代码更简洁、更易读。

5.增强了代码的可测试性:

因为每个策略都在单独的类中,可以更容易地对每种策略进行单元测试。
缺点

1.增加了类的数量:

每个策略都需要创建一个新的类,这会导致类的数量激增,可能导致系统变得复杂。

2.客户端必须了解不同的策略:

客户端需要了解所有可用策略的功能和使用方法,这可能会增加使用的复杂性。

3.适用于较简单的场景:

策略模式更适用于算法较少变化的场景,如果算法频繁变动,可能会导致频繁修改策略类。

4.不适合用于相似的算法:

如果不同的策略之间的差异很小,使用策略模式可能会导致过度设计,并引入不必要的复杂性。

策略模式(Strategy Pattern)适用于以下场合:
  1. 需要多种算法或行为的场景
    当你有多个相似的算法或操作,而需要在运行时选择其中一种时,策略模式非常合适。例如,支付系统中可能会有多种支付方式(如信用卡、PayPal、支付宝),可以使用策略模式来实现。

2. 避免使用条件语句
当代码中存在大量的 if…else 或 switch 语句来选择算法或行为时,可以考虑使用策略模式。通过将不同的算法封装到不同的策略类中,可以使代码更加清晰易读。

3. 算法的变化不影响客户端
当你希望算法或行为的变化不影响使用它的客户端代码时,策略模式可以提供很好的支持。例如,如果算法需要经常更新或替换,可以在不修改客户端代码的情况下实现。

4. 希望动态切换算法
在某些情况下,可能需要根据不同的条件动态选择算法。在这种情况下,策略模式允许在运行时切换策略,以便适应不同的需求或环境。

5. 实现缓存或回调机制
当不同的策略需要在不同的条件下执行时,策略模式可以提供灵活性。比如在网络请求中,根据不同的请求类型使用不同的处理策略。

6. 需要对行为进行扩展
当你希望系统在不修改现有代码的情况下扩展新的行为或算法时,策略模式提供了一种方便的方式。通过添加新的策略类,可以轻松地扩展系统的功能。

7. 遵循开闭原则
如果你的设计需求遵循开闭原则,即对扩展开放,对修改关闭,策略模式是一种理想的选择。你可以通过添加新的策略类而不是修改现有的代码来扩展系统功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python异常检测- 单类支持向量机(One-Class SVM)

系列文章目录 Python异常检测- Isolation Forest(孤立森林) python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS) python异常检测-局部异常因子(LOF)算法 Python异常检测- DBSCAN 文章目录 系列文章目录前言一、On…

图像高清化(论文复现)

图像高清化(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 图像高清化(论文复现)概述算法原理核心逻辑效果演示使用方式概述 本文复现论文 “Zero-Shot” Super-Resolution using Deep Internal Learning[1] 提出的图像超分辨率方法。 图像超分辨率是指从低…

如何从模块内部运行 Pytest

在 Python 中,pytest 是一个强大的测试框架,用于编写和运行测试用例。通常我们会在命令行中运行 pytest,但是有时你可能希望从模块或脚本的内部运行 pytest,比如为了自动化测试或集成到某个工作流程中。 1、问题背景 当你从模块…

Netty无锁化设计之对象池实现

池化技术是比较常见的一种技术,在平时我们已经就接触很多了,比如线程池,数据库连接池等等。当我们要使用一个资源的时候从池中去获取,用完就放回池中以便其他线程可以使用,这样的目的就是为了减少资源开销,…

JMeter 动态参数赋值实践

目录 前言 单线程 用户参数 场景说明 实战结果 配置明细 单线程 CSV Data Set Config 场景说明 实践结果 配置明细 多线程循环单次执行 场景说明 实践结果 配置明细 单线程 控制器 用户自定义变量 用户参数 场景说明 实战结果 配置明细 多并发 多接口 …

AudioSegment 提高音频音量 - python 实现

一些采集的音频声音音量过小可以通过 AudioSegment 实现音量增强。 按照 python 库: pip install AudioSegment 代码具体实现: #-*-coding:utf-8-*- # date:2024-10 # Author: DataBall - XIAN # Function: 音频增加音量import os from pydub import …

Matlab学习01-矩阵

目录 一,矩阵的创建 1,直接输入法创建矩阵 2,利用M文件创建矩阵 3,利用其它文本编辑器创建矩阵 二,矩阵的拼接 1,基本拼接 1) 水平方向的拼接 2)垂直方向的拼接 3&#xf…

记录:网鼎杯2024赛前热身WEB01

目录扫描,发现上传点,判断可能存在文件上传漏洞,并根据文件后缀判断网站开发语言为php 编写蚁剑一句话木马直接上传 蚁剑连接 这里生成 的flag是随机的,因为烽火台反作弊会随机生成环境,在一顿查找后,在hom…

stm32F103 实现呼吸灯效果

目录 硬件连接 软件实现步骤 初始化系统时钟。 配置 GPIO 引脚。 配置定时器以生成 PWM 信号。 在主循环中调整 PWM 占空比以实现呼吸效果。 示例代码 1. 初始化系统时钟 2. 配置 GPIO 引脚 3. 配置定时器以生成 PWM 信号 4. 在主循环中调整 PWM 占空比以实现呼吸效…

5G RedCap工业路由器赋能电力物联网应用

随着5G轻量化技术应用的推进,5G RedCap旨在提供低功耗、低成本、广覆盖等功能特点赋能电力智能化升级。特别适用于工业物联网、低空经济、车联网、消费电子和轻量级5G的需求。 5G RedCap工业路由器的特点 低功耗:5G RedCap工业路由器通过节能技术&#…

npm run serve 提示异常Cannot read property ‘upgrade‘ of undefined

npm run serve 提示Cannot read property ‘upgrade’ of undefined 一般是proxy的target代理域名问题导致的,如下: 解决方案: proxy: { “/remoteDealerReportApi”: { target: ‘http://demo-.com.cn’, //此域名有问题,会导致…

PTA数据库编程练习合集

10-1 查询重量在[40,65]之间的产品信息 本题目要求编写SQL语句&#xff0c; 检索出product表中所有符合40 < Weight < 65的记录。 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE product (Pid varchar(20), --商品编号PName varchar(50), --商品名…

JavaWeb开发7

前后端混合开发 沟通成本高 分工不明确 不便管理 不便维护扩展 前后端分离开发 前端--接口--后端 需求分析--接口定义--前后端并行开发--测试--前后端连调测试 前端开发 模块化 JS、CSS 组件化 UI结构、样式、行为 规范化 目录结构、编码、接口 自动化 构建、部署、…

Git_IDEA集成GitHub

Git_IDEA集成GitHub 设置 GitHub 账号 分享工程到 GitHub push 推送本地库到远程库 pull 拉取远程库到本地库 clone 克隆远程库到本地 设置 GitHub 账号 去 GitHub 账户上设置 token 因为网络原因用账号密码可能登不上&#xff0c;所以选择用口令。 分享工程到 GitHub…

网络安全领域推荐证书介绍及备考指南

在网络安全领域&#xff0c;拥有专业认证不仅可以证明个人的专业能力&#xff0c;还能帮助在实际工作中应用先进的技术和知识。以下是几种热门的网络安全证书介绍及备考指南。 1. OSCP (Offensive Security Certified Professional) 证书简介 OSCP是针对渗透测试领域的入门级…

Matlab 疲劳驾驶检测

课题介绍 该课题为基于眼部和嘴部的疲劳驾驶检测。带有一个人机交互界面GUI&#xff0c;通过输入视频&#xff0c;分帧&#xff0c;定位眼睛和嘴巴&#xff0c;通过眼睛和嘴巴的张合度&#xff0c;来判别是否疲劳。 二、操作步骤 第一步&#xff1a;最好电脑安装的是MATLAB …

Jmeter 实战 JDBC配置

​ JDBC JDBC&#xff08;Java Database Connectivity&#xff09;是一种用于执行SQL语句的Java API。通过这个API&#xff0c;可以直接连接并执行SQL脚本&#xff0c;与数据库进行交互。 使用JMeter压力测试时&#xff0c;操作数据库的场景 在使用JMeter进行接口压力测试时…

全栈面试题】模块3-9】JavaSE高级 -- Object类、 GC、反射、Socket

目录 面试题3.62 JAVA中Object类中有哪些常用方法&#xff1f; 面试题3.63 什么是深拷贝和浅拷贝 面试题3.64 GC是什么? 为什么要有GC? 面试题3.65 JVM垃圾回收机制和常见算法 面试题3.66 简单的介绍⼀下强引用&#xff0c;软引用&#xff0c;弱引用&#xff0c;虚引用 …

基于SSM消防物资存储系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;仓库管理&#xff0c;物资入库管理&#xff0c;仓位管理&#xff0c;物资详情管理&#xff0c;报警通知管理&#xff0c;安全检查提醒管理 用户账号功能包括&#xff1a;系统首页…

【数据分享】全国能源-电力平衡表(2000-2020年)

数据介绍 一级标题指标名称单位能源电力可供量亿千瓦小时能源电力生产量亿千瓦小时能源水电生产电力量亿千瓦小时能源火电生产电力量亿千瓦小时能源核电生产电力量亿千瓦小时能源风电生产电力量亿千瓦小时能源电力进口量亿千瓦小时能源电力出口量亿千瓦小时能源电力能源消费总量…