技术成神之路:设计模式(六)策略模式

1.介绍


策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,封装每一个算法,并使它们可以相互替换。策略模式使得算法的变化独立于使用算法的客户端。

2.主要作用


策略模式的主要作用是将算法或行为的选择从使用者中分离出来,使得可以在运行时选择不同的算法或行为。这种方式使得代码更加灵活、可扩展。

3.解决的问题


策略模式的主要作用是通过定义一系列算法,使得它们可以相互替换,从而达到以下几个目的:

  • 算法选择:需要根据不同的条件选择不同的算法时,可以使用策略模式避免复杂的条件语句。
  • 代码复用:通过封装不同的策略,减少代码重复,提高可复用性。
  • 算法独立:使得算法的变化独立于使用它的客户端,便于扩展和维护

4.模式原理


包含角色:

  1. 策略接口(Strategy):定义一系列算法的接口,所有具体策略都需要实现这个接口。
  2. 具体策略(ConcreteStrategy):实现策略接口的具体类,每个具体策略实现不同的算法。
  3. 上下文(Context):持有一个策略的引用,提供选择和使用策略的功能,通常允许在运行时改变所用策略。

UML类图:
在这里插入图片描述
代码示例:

使用策略模式来实现不同的排序算法。

// 策略接口
interface SortStrategy {void sort(int[] array);
}// 具体策略:快速排序
class QuickSort implements SortStrategy {public void sort(int[] array) {// 实现快速排序System.out.println("使用快速排序");}
}// 具体策略:冒泡排序
class BubbleSort implements SortStrategy {public void sort(int[] array) {// 实现冒泡排序System.out.println("使用冒泡排序");}
}// 上下文
class SortContext {private SortStrategy strategy;public void setStrategy(SortStrategy strategy) {this.strategy = strategy;}public void sort(int[] array) {strategy.sort(array);}
}// 使用
public class StrategyPatternExample {public static void main(String[] args) {SortContext context = new SortContext();int[] array = {5, 2, 9, 1};context.setStrategy(new QuickSort());context.sort(array); // 输出:使用快速排序context.setStrategy(new BubbleSort());context.sort(array); // 输出:使用冒泡排序}
}

策略模式结构不算复杂,更容易理解,在项目中使用的也比较多,再举个我在项目中遇到的真实案例吧:

当时做跑步机软件,有个需求是需要显示心率值,而心率的来源有多个,比如:心率手柄,华为运动健康,还有其他App,他们之间还有优先级,华为运动健康第一,其他App第二,心率手柄第三,当三个心率源都有心率上报时,需要根据优先级进行显示心率值,而在获取心率值的时候 就只需在 策略模式所说的上下文 中get就行了,无需关心内部实现,至于策略动态切换,以及其他相关逻辑都包含在了上下文中。

当然,上述概念和举例只是帮助你快速理解策略模式,以及在实际项目中遇到相应需求能想到它就可以了,真实的需求实现肯定不会像示例中那么简单,记得灵活运用。

5.优缺点


优点

  • 灵活性:允许在运行时根据需要切换算法。
  • 可扩展性:新的算法可以很方便地加入到系统中,无需修改原有的代码。
  • 避免条件语句:策略模式避免了复杂的条件语句,使代码更加清晰。

缺点

  • 客户端必须了解不同的策略:客户端需要理解不同策略之间的差异,选择合适的策略。

6.应用场景


  • 多种算法选择:当需要根据不同条件选择不同算法时,如排序、支付方式等。
  • 需要封装一系列的算法:例如图形绘制中,可以根据不同的图形类型选择不同的绘制策略。
  • 需要使用不同策略的对象:例如,系统中有多个对象需要使用不同的策略,但又希望统一管理。

这时候你是不是突然想拿自己项目中的某些功能练手了😎,各位不要随便为了设计而修改现有完善模块代码哈,能就行 🤪,开个玩笑,设计模式就是为了方便我们写出更容易维护,更适合自己的代码的,而不是为了设计而设计的。

还有还有 说到这了再提一嘴😁

硬编码和条件判断(if…else 或 switch)

大家在项目中写没写过 通过 if...elseswitch 来选择不同的执行路径,使用哪种算法,哪种解析方式,哪种网络请求… 这中if...elseswitch选择方式我们叫做硬编码,当条件足够多的时候,看着很不美观,维护难度也大,恰恰这种类型的代码,可以使用策略模式代替哦!

7.总结


策略模式通过将算法封装为独立的策略类,提供了一种灵活的方式来选择和使用算法。它提高了代码的可维护性和扩展性,符合面向对象设计的基本原则。在需要动态选择算法和减少条件判断时,策略模式是一种非常有效的解决方案。

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

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

相关文章

什么叫图像的双边滤波,并附利用OpenCV和MATLB实现双边滤波的代码

双边滤波(Bilateral Filtering)是一种在图像处理中常用的非线性滤波技术,主要用于去噪和保边。它在空间域和像素值域上同时进行加权,既考虑了像素之间的空间距离,也考虑了像素值之间的相似度,从而能够有效地…

手机怎么看WiFi的IP地址

在如今数字化快速发展的时代,无线网络已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,我们可能都离不开WiFi的陪伴。然而,在使用WiFi的过程中,有时我们可能需要查看其IP地址,以便更好地管理我们的网…

【动态规划】背包问题 {01背包问题;完全背包问题;二维费用背包问题}

一、背包问题概述 背包问题(Knapsackproblem)是⼀种组合优化的NP完全问题。 问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最⾼。 根据物品的个数…

链接追踪系列-07.logstash安装json_lines插件

进入docker中的logstash 容器内: jelexbogon ~ % docker exec -it 7ee8960c99a31e607f346b2802419b8b819cc860863bc283cb7483bc03ba1420 /bin/sh $ pwd /usr/share/logstash $ ls bin CONTRIBUTORS Gemfile jdk logstash-core modules tools x-pack …

语音识别概述

语音识别概述 一.什么是语音? 语音是语言的声学表现形式,是人类自然的交流工具。 图片来源:https://www.shenlanxueyuan.com/course/381 二.语音识别的定义 语音识别(Automatic Speech Recognition, ASR 或 Speech to Text, ST…

基于RAG大模型的变电站智慧运维-第十届Nvidia Sky Hackathon参赛作品

第十届Nvidia Sky Hackathon参赛作品 1. 项目说明 变电站是用于变电的设施,主要的作用是将电压转化,使电能在输电线路中能够长距离传输。在电力系统中,变电站起到了极为重要的作用,它可以完成电能的负荷分配、电压的稳定、容错保…

电影购票小程序论文(设计)开题报告

一、课题的背景和意义 随着互联网技术的不断发展,人们对于购票的需求也越来越高。传统的购票方式存在着排队时间长、购票流程繁琐等问题,而网上购票则能够有效地解决这些问题。电影购票小程序是网上购票的一种新型应用,它能够让用户随时随地…

06.截断文本 选择任何链接 :root 和 html 有什么区别

截断文本 对超过一行的文本进行截断,在末尾添加省略号(…)。 使用 overflow: hidden 防止文本超出其尺寸。使用 white-space: nowrap 防止文本超过一行高度。使用 text-overflow: ellipsis 使得如果文本超出其尺寸,将以省略号结尾。为元素指定固定的 width,以确定何时显示省略号…

笔记 4 :linux 0.11 中继续分析 0 号进程创建一号进程的 fork () 函数

(27)本条目开始, 开始分析 copy_process () 函数,其又会调用别的函数,故先分析别的函数。 get_free_page () ; 先 介绍汇编指令 scasb : 以及 指令 sstosd :…

什么是架构设计师?定义、职责和任务,全方位解析需要具备的专业素质

目录 1. 架构设计师的定义 2. 架构设计师的职责和任务 2.1 系统架构设计 2.1.1 模块划分 2.1.2 接口设计 2.1.3 通信方式 2.2 技术选型与决策 2.2.1 技术评估 2.2.2 技术选型 2.2.3 技术决策 2.3 性能优化与调优 2.3.1 性能分析 2.3.2 性能优化 2.3.3 性能调优 …

视图库对接系列(GA-T 1400)十七、视图库对接系列(本级)采集设备获取

背景 这一章的话,我们写写如何获取采集设备获取,之前其实也有说过类似的 就我们订阅的时候如果subscribeDetail=3的话,下级就会主动给我们推送采集设备。但这里的话,是下级主动推,如果下级平台不支持,或者说可能因为某个原因推的不全,怎么办? 我们能否主动获取采集设备…

WPF学习(4) -- 数据模板

一、DataTemplate 在WPF(Windows Presentation Foundation)中,DataTemplate 用于定义数据的可视化呈现方式。它允许你自定义如何展示数据对象,从而实现更灵活和丰富的用户界面。DataTemplate 通常用于控件(如ListBox、…

知识图谱和 LLM:利用 Neo4j 实现大型语言模型

这是关于 Neo4j 的 NaLLM 项目的一篇博客文章。这个项目是为了探索、开发和展示这些 LLM 与 Neo4j 结合的实际用途。 2023 年,ChatGPT 等大型语言模型 (LLM) 因其理解和生成类似人类的文本的能力而风靡全球。它们能够适应不同的对话环境、回答各种主题的问题,甚至模拟创意写…

NSSCTF中24网安培训day1中web的题目

我flag呢 直接查看源代码即可CtrlU [SWPUCTF 2021 新生赛]Do_you_know_http 用Burpsuite抓包,之后在User-agent下面添加XFF头,即X-Forwarded-For:127.0.0.1 [SWPUCTF 2022 新生赛]funny_php 首先是php的弱比较,对于num参数,我们…

hot100 | 十一、二分搜索

1-leetcode35. 搜索插入位置 注意&#xff1a; 看Labuladong的书&#xff0c;知道while的判断符号跟left right的关系 public int searchInsert(int[] nums, int target) {int left 0;int right nums.length - 1;while (left < right) {int mid left (right - left) /…

PostgreSQL日志文件配置,记录所有操作记录

为了更详细的记录PostgreSQL 的运行日志&#xff0c;我们一般需要修改PostgreSQL 默认的配置文件&#xff0c;这里整理了一些常用的配置 修改配置文件 打开 PostgreSQL 配置文件 postgresql.conf。该文件通常位于 PostgreSQL 安装目录下的 data 文件夹中。 找到并修改以下配…

【Qt 基础】绘图

画笔 QPen pen; pen.setWidth(3); // 线条宽度 pen.setColor(Qt::red);// 画笔颜色 pen.setStyle(Qt::DashLine);// 线条样式 pen.setCapStyle(Qt::RoundCap);// 线端样式 pen.setJoinStyle(Qt::BevelJoin);// 连接样式 painter.setPen(pen);线条 线端 连接 画刷 QBrush bru…

Spring容器详细介绍

Spring容器 1 Spring核心容器介绍 问题导入 问题&#xff1a;按照Bean名称获取Bean有什么弊端&#xff0c;按照Bean类型获取Bean有什么弊端&#xff1f; 1.1 创建容器 方式一&#xff1a;类路径加载配置文件 ApplicationContext ctx new ClassPathXmlApplicationContext…

复合类型的字节对齐

引子 #inlcude<stdio.h> struct s{int i;char a: }; struct s sVar {5,A}; int main(void){printf("%d\n",sizeof(sVar)); }问1&#xff1a;上面这个代码的输出结果是多少&#xff1f; 答1&#xff1a; 思考 明明sVar这个结构体就两个元素&#xff0c;5和…

uniapp实现水印相机

uniapp实现水印相机-livePusher 水印相机 背景 前两天拿到了一个需求&#xff0c;要求在内部的oaApp中增加一个卫生检查模块&#xff0c;这个模块中的核心诉求就是要求拍照的照片添加水印。对于这个需求&#xff0c;我首先想到的是直接去插件市场&#xff0c;下一个水印相机…