【设计模式-策略】

定义

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变化不会影响到使用算法的客户。通过使用策略模式,算法可以在运行时根据需要动态地进行更换,从而使得程序具有更好的扩展性和维护性。

特点

  • 封装算法:将不同的算法封装在独立的类中,客户端无需知道具体的算法实现。
  • 互换算法:策略模式使得算法可以在运行时动态替换,而不影响使用这些算法的客户端。
  • 开闭原则:通过策略模式,可以在不修改现有代码的情况下添加新的算法。

组成:

  • 策略接口(Strategy Interface):定义了一个算法族,所有具体的算法都实现这个接口。
  • 具体策略(Concrete Strategy):实现了策略接口的具体算法类。
  • 上下文(Context):持有一个策略的引用,并在客户端需要时调用策略的方法。

在这里插入图片描述

策略接口

public interface DiscountStrategy {double calculateDiscount(double price);
}

具体策略

// 无折扣策略
public class NoDiscountStrategy implements DiscountStrategy {@Overridepublic double calculateDiscount(double price) {return price; // 原价,没有折扣}
}// 打八折策略
public class PercentageDiscountStrategy implements DiscountStrategy {private double percentage;public PercentageDiscountStrategy(double percentage) {this.percentage = percentage;}@Overridepublic double calculateDiscount(double price) {return price * (1 - percentage / 100); // 按百分比打折}
}// 满减策略
public class ThresholdDiscountStrategy implements DiscountStrategy {private double threshold;private double discount;public ThresholdDiscountStrategy(double threshold, double discount) {this.threshold = threshold;this.discount = discount;}@Overridepublic double calculateDiscount(double price) {return price >= threshold ? price - discount : price;}
}

创建上下文类

// 上下文类,持有一个策略的引用,并在运行时使用策略
public class ShoppingCart {private DiscountStrategy discountStrategy;// 设置折扣策略public void setDiscountStrategy(DiscountStrategy discountStrategy) {this.discountStrategy = discountStrategy;}// 计算最终价格public double calculateFinalPrice(double price) {return discountStrategy.calculateDiscount(price);}
}

使用

public class StrategyPatternExample {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();// 使用无折扣策略cart.setDiscountStrategy(new NoDiscountStrategy());System.out.println("Final Price (No Discount): " + cart.calculateFinalPrice(100));// 使用百分比折扣策略cart.setDiscountStrategy(new PercentageDiscountStrategy(20));System.out.println("Final Price (20% Discount): " + cart.calculateFinalPrice(100));// 使用满减策略cart.setDiscountStrategy(new ThresholdDiscountStrategy(100, 15));System.out.println("Final Price (Threshold Discount): " + cart.calculateFinalPrice(120));}
}

优点

  • 遵循开闭原则:可以在不修改现有代码的情况下引入新的策略。
  • 消除条件判断:策略模式通过策略类代替了条件语句(如 if-else 或 switch-case),使代码更具可读性和可维护性。
  • 算法独立:不同的算法被封装在独立的类中,彼此独立,可以自由切换和替换。
  • 提高代码的灵活性:策略模式使得算法的选择在运行时变得更为灵活,而不是在编译时就被确定。

缺点

  • 增加了系统的复杂性:每个具体策略都需要定义一个类,如果策略过多,类的数量会显著增加。
  • 策略的选择:客户端必须知道不同策略之间的区别,才能选择合适的策略。

场景

  • 需要动态选择算法的场景:当一个系统需要在运行时选择不同的算法时,可以使用策略模式。
  • 多重条件语句的替代:当一个系统中存在大量的条件语句来决定不同的行为时,可以考虑使用策略模式来替代这些条件语句。
  • 需要避免代码重复的场景:不同的算法通常会有相似的结构,但在某些部分有所不同。使用策略模式可以避免重复代码,提高代码复用性。

总结

策略模式通过将不同的算法封装在独立的策略类中,使得算法之间可以互换,并且能够在运行时动态地选择合适的策略。这种模式在需要动态选择行为、避免条件语句、提高代码可维护性和扩展性方面有着显著的优势。

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

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

相关文章

Golang | Leetcode Golang题解之第372题超级次方

题目: 题解: const mod 1337func pow(x, n int) int {res : 1for ; n > 0; n / 2 {if n&1 > 0 {res res * x % mod}x x * x % mod}return res }func superPow(a int, b []int) int {ans : 1for _, e : range b {ans pow(ans, 10) * pow(a…

前端页面调用本地exe,打开exe主界面

一、文件配置 在桌面新建文件Start.txt 复制以下内容,保存后修改后缀名.txt为 .reg。 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Start] "URL Protocol""D:\\Task\\app.exe" "Start Protocol" [HKEY_CLASSES_ROOT\…

第20讲 动画讲解轻松学会STM32的PWM

来源:【STM32】动画讲解轻松学会STM32的PWM_哔哩哔哩_bilibili 基本概念 周期/频率 计算公式:PWM周期1个高电平用时1个低电平用时 PWM的频率1/周期 如图所示此时周期为1ms,即1s内存在1000组这样的高低电平,PWM的频率为1000hz。…

Python自动化办公2.0 课程更新

之前的课程,包含了Python pandassklearn 数据分析,和Stremlit 可视化仪表盘的开发 和一系列自动化项目案例的开发,包括我们封装了ztl-uia 模块,可以同时自动化操控windows 软件和浏览器, 封装的模块,针对为付费学员使…

使用 FinalShell 链接 Centos

1. 安装 FinalShell 下载地址:https://www.hostbuf.com/t/988.html 2. 查看 IP地址。 2.1 通过命令查询IP 输入 ip addr show 查询,输出效果如下截图,其中的 192.168.1.5 就是 IP 地址。 2.2 通过可视化界面查询IP 点击右上角的网络图标…

亲测分享:这个获客工具,精准又好用!

如何高效、精准地获取目标客户成为了每一家企业都面临的重大挑战。传统的获客方式不仅效率低下,而且成本高昂,往往难以达到预期的营销效果。 今天,我就作为一位亲身体验者,向大家分享这个精准又好用的获客工具——易拓客。 随时…

论文辅助笔记:Large Language Models are Zero-Shot Next LocationPredictors

论文理论部分:论文笔记:lunLarge Language Models are Zero-Shot Next LocationPredictors-CSDN博客 2 Data 2.1 Dataset类 2.2 下载文件 2.3 get_dataset 2.4 get_trajectories trajectory_split暂时略去 # save the test dictionary and the true l…

cad导出为jpg图片的方法,分享这三种方法

在工程设计、建筑设计或任何需要使用CAD(计算机辅助设计)软件的领域,将CAD图纸转换成JPG图片格式是日常工作中不可或缺的一环。无论是为了更便捷地在网络上分享设计稿,还是为了在非CAD环境中展示设计成果,掌握CAD到JPG…

CSS3视图过渡动画

概述 网站的主题切换无非就是文字、背景图片或者颜色,我们可以先来看下 Element UI 官网的切换主题的动效: PS:Antdesign UI的主题切换动画也是大同小异。 实现的两种方式 CSS 为主 <script setup> const changeTheme = (e) => {if (document.startViewTransi…

[数据集][目标检测]电力场景红外图像输电线路绝缘子检测数据集VOC+YOLO格式1846张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1846 标注数量(xml文件个数)&#xff1a;1846 标注数量(txt文件个数)&#xff1a;1846 标注…

2024年新算法-基于SBOA-BP混合神经网络的数据预测(Python代码实现)

在今天的数字化时代&#xff0c;机器学习和人工智能领域的不断发展为数据处理和预测提供了强大的工具。其中&#xff0c;BP神经网络&#xff08;反向传播神经网络&#xff09;作为一种经典的网络模型&#xff0c;因其能够处理复杂的非线性问题而备受关注。然而&#xff0c;传统…

Git 基础使用--权限管理--用户和用户组授权

&#x1f600;前言 本篇博文是关于Git 基础使用–权限管理–用户和用户组授权&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满…

JMeter接口测试:重复请求失败,单独请求成功

针对新增用户接口&#xff0c;反复发送同一请求&#xff0c;一次成功一次失败或失败和成功不定&#xff1b; 考虑&#xff1a;该请求的所需时间可能较长&#xff0c;服务器还未来得及响应或释放资源&#xff0c;便开始执行下一请求&#xff0c;导致报500 服务器异常错误&#x…

如何在小程序中完整显示图片且不变形

在开发小程序时&#xff0c;我们经常需要在界面上展示图片。有时&#xff0c;我们希望图片能够完整显示&#xff0c;不进行任何裁剪或变形。本文将介绍如何在小程序中实现这一需求。 使用<image>组件的mode属性 小程序的<image>组件提供了多种模式来控制图片的显…

错误日志:/usr/bin/ld: cannot find -lmkl_intel_ilp64 -lmkl_core -lmkl_intel_thread

Reference: Cannot find mkl libraries from conda 在使用 LibTorch 时&#xff0c;报了以下错误&#xff1a; 在 share/cmake/Caffe2/public/mkl.cmake 下的cmake&#xff0c;并不能保证能找到MKL&#xff0c;应该是MKL版本更新导致的不通用问题。将文件改成下面写法即可&a…

Level3 — PART 4 — 机器学习算法 — 关联规则

目录 基本概念 评估指标 支持度 置信度 提升度 规则发现 Apriori算法 原理 案例 Python中实现Apriori算法 FP-Growth 案例 Python中实现FP-Growth 模拟题 CDA LEVEL III 模拟题(一) CDA LEVEL III 模拟题(二) Apriori算法是一种经典的关联规则数据…

[数据集][目标检测]玻璃瓶塑料瓶检测数据集VOC+YOLO格式8943张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8943 标注数量(xml文件个数)&#xff1a;8943 标注数量(txt文件个数)&#xff1a;8943 标注…

ssrf简介

目录 SSRF漏洞 漏洞原理 形成原因 SSRF用途: 怎么找到SSRF漏洞? 漏洞案例 SSRF漏洞 漏洞原理 SSRF(Server-Side Request Forgery:服务器端请求伪造)是——种由仅专构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF是要目标网站的内部系统。(因为他是…

初识redis:Zset有序集合

Set作为集合&#xff0c;有两个特点&#xff1a;唯一且无序。 Zset是有序集合&#xff0c;在保证唯一的情况下&#xff0c;是根据什么来排序的呢&#xff1f;排序的规则是什么&#xff1f; Zset中的member引入了一个属性&#xff0c;分数&#xff08;score&#xff09;&#…

NLP从零开始------14.文本中阶序列处理之语言模型(2)

3.2 长短期记忆 梯度消失问题的一个解决方案是使用循环神经网络的变体——长短期记忆( long short- term memory, LSTM)。 长短期记忆的原理是&#xff0c; 在每一步t&#xff0c; 都保存一个隐状态和一个单元状态( cell state) , 通过单元状态来存储长距离信息&#xff0c; 长…