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

策略模式(知识点)——设计模式学习笔记

文章目录

  • 0 概念
  • 1 使用场景
  • 2 优缺点
    • 2.1 优点
    • 2.2 缺点
  • 3 实现方式
  • 4 和其他模式的区别
  • 5 具体例子实现
    • 5.1 实现代码

0 概念

定义:定义一个算法族,并分别封装起来。策略让算法的变化独立于它的客户(这样就可在不修改上下文代码或其他策略的情况下,添加新算法或修改已有算法)。

上下文通过同样的通用接口与所有策略进行交互, 而该接口只需暴露一个方法来触发所选策略中封装的算法即可。

1 使用场景

1,当你想使用对象中各种不同的算法变体, 并希望能在运行时切换算法时, 可使用策略模式。

策略模式让你能够将对象关联至可以不同方式执行特定子任务的不同子对象, 从而以间接方式在运行时更改对象行为。

2,当你有许多仅在执行某些行为时略有不同的相似类时, 可使用策略模式。

策略模式让你能将不同行为抽取到一个独立类层次结构中, 并将原始类组合成同一个, 从而减少重复代码。

3,如果算法在上下文的逻辑中不是特别重要, 使用该模式能将类的业务逻辑与其算法实现细节隔离开来。

策略模式让你能将各种算法的代码、 内部数据和依赖关系与其他代码隔离开来。 不同客户端可通过一个简单接口执行算法, 并能在运行时进行切换。

4,当类中使用了复杂条件运算符以在同一算法的不同变体中切换时, 可使用该模式。

策略模式将所有继承自同样接口的算法抽取到独立类中, 因此不再需要条件语句。 原始对象并不实现所有算法的变体, 而是将执行工作委派给其中的一个独立算法对象。

2 优缺点

2.1 优点

  • 可以在运行时切换对象内的算法。
  • 可以将算法的实现和使用算法的代码隔离开来。
  • 可以使用组合来代替继承。
  • 开闭原则。 无需对上下文进行修改就能够引入新的策略。

2.2 缺点

  • 如果你的算法极少发生改变, 那么没有任何理由引入新的类和接口。 使用该模式只会让程序过于复杂。

  • 客户端必须知晓策略间的不同——它需要选择合适的策略。

  • 许多现代编程语言支持函数类型功能, 允许你在一组匿名函数中实现不同版本的算法。 这样, 你使用这些函数的方式就和使用策略对象时完全相同, 无需借助额外的类和接口来保持代码简洁。

3 实现方式

1,从上下文类中找出修改频率较高的算法 (也可能是用于在运行时选择某个算法变体的复杂条件运算符)。

2,声明该算法所有变体的通用策略接口。

3,将算法逐一抽取到各自的类中, 它们都必须实现策略接口。

4,在上下文类中添加一个成员变量用于保存对于策略对象的引用。 然后提供设置器以修改该成员变量。 上下文仅可通过策略接口同策略对象进行交互, 如有需要还可定义一个接口来让策略访问其数据。

4 和其他模式的区别

请添加图片描述

5 具体例子实现

实现要求:鸭子共有三种行为,游泳行为(所有鸭子都会),飞行行为(能飞/不能飞/具有火箭动力的飞行),叫声行为(嘎嘎叫/吱吱叫/什么都不会叫),不同具体鸭子(绿头鸭/模型鸭/…)飞行行为和叫声行为可能不一样。

⚠️:最终目标:给具体鸭的飞行行为和叫声行为添加新功能时,不会改变基类鸭和具体鸭。)

  • 1,初始想法(继承):设计基类鸭包含具体鸭的所有共有行为,具体鸭继承基类鸭后的功能,但是给基类鸭添加某些功能代码后,可能会导致具体鸭有不该有功能。
    在这里插入图片描述

  • 2,改进:把变化的部分抽取出来,设计为接口,让具体鸭继承基类鸭和飞行行为、叫声行为的接口。
    在这里插入图片描述

但是这样设计会产生大量冗余代码(很多具体鸭子的功能是相互重复的)。
在这里插入图片描述

  • 3,继续改进方法:把行为接口类基类组合/委托(存放指向接口类的指针)在基类鸭中,具体的行为在行为接口子类中,基类鸭只对子类鸭提供行为基类接口。这样更改飞行/叫声行为就不会影响到抽象鸭和具体鸭。

在这里插入图片描述

5.1 实现代码

C++、Java、Python代码实现的具体方法见此博文。

请添加图片描述

完整的代码,见Gitee仓库。

相关文章:

策略模式(知识点)——设计模式学习笔记

文章目录 0 概念1 使用场景2 优缺点2.1 优点2.2 缺点 3 实现方式4 和其他模式的区别5 具体例子实现5.1 实现代码 0 概念 定义:定义一个算法族,并分别封装起来。策略让算法的变化独立于它的客户(这样就可在不修改上下文代码或其他策略的情况下…...

Python学习从0开始——专栏汇总

Python学习从0开始——000参考 一、推荐二、基础三、项目一 一、推荐 Hello World in Python - 这个项目列出了用Python实现的各种"Hello World"程序。 Python Tricks - 这个项目包含了Python中的高级技巧和技术。 Think Python - 这是一本教授Python的在线书籍&…...

【iOS ARKit】Web 网页中嵌入 AR Quick Look

在支持 ARKit 的设备上,iOS 12 及以上版本系统中的 Safari浏览器支持 AR Quick Look, 因此可以通过浏览器直接使用3D/AR 的方式展示 Web 页面中的模型文件,目前 Web 版本的AR Quick Look 支持USDZ 格式文件。苹果公司有一个自建的3D模型示例库…...

Java基础-知识点03(面试|学习)

Java基础-知识点03 String类String类的作用及特性String不可以改变的原因及好处String、StringBuilder、StringBuffer的区别String中的replace和replaceAll的区别字符串拼接使用还是使用StringbuilderString中的equal()与Object方法中equals()区别String a new String("a…...

【GIS学习笔记】ArcGIS/QGIS如何修改字段名称、调整字段顺序?

在先前的ArcGIS学习中,了解到字段名称是不能修改的,只能用新建一个字段赋值过去再删除原字段这种方法实现,字段顺序的调整如果通过拖拽也是不能持久的,需要用导出一个新数据这种方法进行保存,可参考以下链接&#xff1…...

Study Pyhton

PyCharm PyCharm是一个写python代码的软件,用PyCharm写代码比较方便。 PyCharm快捷键ctrl alt s打开软件设置ctrl d复制当前行代码 shift alt 上\下将当前行代码上移或下移crtl shift f10运行当前代码文件shiftf6重命名文件 ctrl a全选ctrl c\v\x复制、粘贴、…...

【MySQL】:深入解析多表查询(下)

🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. 自连接1.1 自连接查询1.2 联合查询 二. 子查询2.1 概述2.2 分类2.3 标量子查…...

图像入门处理4(How to get the scaling ratio between different kinds of images)

just prepare for images fusion and registration ! attachments for some people who need link1 图像处理入门 3...

【项目精讲】Swagger接口文档以及使用方式

Swagger 介绍 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/) 前后端分离开发,有利于团队合作接口的文档在线自动生成,降低后端开发人员编写接口文档的负担功能测试 如何使…...

ThingsBoard通过服务端获取客户端属性或者共享属性

MQTT基础 客户端 MQTT连接 通过服务端获取属性值 案例 1、首先需要创建整个设备的信息,并复制访问令牌 ​2、通过工具MQTTX连接上对应的Topic 3、测试链接是否成功 4、通过服务端获取属性值 5、在客户端查看对应的客户端属性或者共享属性的key 6、查看整个…...

(78)删除有序数组中的重复项(79)排序矩阵查找

文章目录 1. 每日一言2. 题目(78)删除有序数组中的重复项2.1 解题思路2.2 代码 3. 题目(79)排序矩阵查找3.1 解题思路3.1.1 暴力查找暴力查找代码 3.1.2 二分查找二分查找代码 3.1.3 贪心贪心代码 4. 结语 1. 每日一言 水晶帘动微风起,满架蔷薇一院香。 —高骈- 2.…...

elasticSearch从零整合springboot项目实操

type会被弃用 ,就是说之后的elasticSearch中只会存在 索引(indices) 和 一行(document) 和字段(fields) elasticSearch 和solr的区别最大的就是 es对应的 是 json的格式 。 solr有xml和josn等…...

【Linux实践室】Linux高级用户管理实战指南:用户所属组变更操作详解

🌈个人主页:聆风吟_ 🔥系列专栏:Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 🔔Linux查看用户所属组2.1.1 👻使…...

C语言: 字符串函数(下)

片头 在上一篇中,我们介绍了字符串函数。在这一篇章中,我们将继续学习字符串函数,准备好了吗?开始咯! 1.strncpy函数 1.1 strncpy函数的用法 strncpy是C语言中的一个字符串处理函数,它用于将一个字符串的一部分内容…...

WPF 数据绑定类属性 和数据更新

WPF中数据绑定是一个非常强大的功能,不仅可以绑定后台数据,还可以进行实时更新。 数据绑定实例 : 在后台创建模型类,然后在标签页面进行导入并绑定。 第一步: // 在后台创建模型类 public class MyData {public string Name { get; set; }…...

使用云服务器搭建CentOS操作系统

云服务器搭建CentOS操作系统 前言一、购买云服务器腾讯云阿里云华为云 二、使用 XShell 远程登陆到 Linux关于 Linux 桌面下载 XShell安装XShell查看 Linux 主机 ip使用 XShell 登陆主机 三、无法使用密码登陆的解决办法 前言 CentOS是一种基于Red Hat Enterprise Linux&#…...

unity的引用传递和数组的联系

引用传递 //引用传递 static void SetY(out int x,out int y ){x 0;y 0;x 1000;}static void Main(string[] args){int x 0;int y 10;SetY(out x, out y);Console.WriteLine($"x{x},y{y}");} 结果是:x1000,y0 数组的引用传递 数组值…...

Android bug Unresolved reference: BR

新建项目后 导入viewBinding 编译后提示 Unresolved reference: BR 解决办法 app 目录下 build.gradle 中 plugins 节点 添加 id kotlin-kapt参考 https://stackoverflow.com/questions/77409050/could-not-find-androidx-corecore-ktx1-8-10...

Unity DOTS1.0 入门(1) ECS机制与概述

ECS机制与概述 Entity:实体 由一个一个的Component组合在一起,是连续的内存布局。通过EnitityManager来负责高效的分配和释放相关entity. World:世界 一个entity的集合,在当前世界里面,每个Entity都有唯一不同的entityld;运行时Unity会自动创建一个D…...

root管理员用户启动kibana报错

问题描述: CentOS7.9.2009环境,以root管理员用户启动kibana7.11.1程序报如下错误: Kibana should not be run as root. Use --allow-root to continue. [root@elasticsearch bin]# whoami root [root@elasticsearch bin]# pwd /usr/local/kibana-7.11.1-linux-x86_64/bi…...

在ubuntu上为nodejs后端服务接入taotoken多模型api的步骤

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在 Ubuntu 上为 Node.js 后端服务接入 Taotoken 多模型 API 的步骤 为后端服务集成大模型能力是现代应用开发的常见需求。如果你在…...

简化OpenAI API调用:轻量级封装库实践指南

1. 项目概述:一个极简的OpenAI API封装库 如果你正在开发一个需要集成AI能力的应用,比如一个聊天机器人、一个内容生成工具,或者一个代码助手,那么你大概率绕不开OpenAI的API。它的功能强大,文档也还算清晰&#xff0…...

ARM PMU性能监控单元架构与PMEVTYPER寄存器详解

1. ARM PMU性能监控单元架构解析性能监控单元(Performance Monitoring Unit, PMU)是现代ARM处理器中用于硬件级性能分析的关键组件。作为芯片上的专用硬件计数器,PMU能够在不显著影响程序执行效率的前提下,实时捕获各类微架构事件。与软件层面的性能分析…...

cPanel三连漏洞CVE-2026-29201/29202/29203深度解析:150万服务器面临全面接管危机

一、事件引言:2026年主机行业最大安全地震 2026年5月8日,全球市场份额第一的服务器管理面板cPanel & WHM 发布紧急安全公告,一次性披露三个高危安全漏洞(CVE-2026-29201/29202/29203)。这组被安全界称为"cPa…...

别再乱点鼠标了!用netsh advfirewall命令搞定Windows防火墙,效率翻倍(附常用场景命令清单)

Windows防火墙命令行实战:netsh advfirewall高阶应用指南 每次看到同事在图形界面里一层层点击"控制面板→系统和安全→Windows Defender防火墙→高级设置"时,我都忍不住想递给他一个命令行窗口。作为IT运维老手,我早已习惯用netsh…...

从原理图到PCB:手把手教你搞定PCIE X4接口的完整电路设计(附时钟、电源、热插拔信号详解)

从原理图到PCB:手把手教你搞定PCIE X4接口的完整电路设计 在高速数字电路设计中,PCIE接口因其出色的带宽和稳定性,已成为现代计算机系统中不可或缺的组成部分。无论是主板设计、显卡开发还是各类扩展卡,PCIE接口的正确实现直接关…...

手把手教你给天邑TY1608机顶盒刷机(S905L3B芯片,支持RTL8822CS/MT7668无线模块)

天邑TY1608机顶盒刷机全攻略:从零开始玩转S905L3B芯片 第一次拿到天邑TY1608机顶盒时,你可能被它原厂系统的各种限制所困扰——预装软件无法卸载、广告弹窗频繁出现、存储空间严重不足。这款搭载Amlogic S905L3B芯片的设备,配合RTL8822CS或MT…...

卡尔曼滤波中的‘信任度’分配:从高斯分布乘积公式看估计与观测谁更重要

卡尔曼滤波中的‘信任度’分配:从高斯分布乘积公式看估计与观测谁更重要 在机器人定位或金融时间序列预测中,我们常常面临一个核心问题:当预测值和观测值都存在不确定性时,如何决定更信任哪一个?这不仅仅是数学问题&a…...

告别卡顿!在Qt/C++中手动绑定线程到指定CPU核心(附性能对比测试)

告别卡顿!在Qt/C中手动绑定线程到指定CPU核心(附性能对比测试) 在开发高性能桌面应用时,卡顿问题往往让开发者头疼不已。无论是音视频处理软件还是大型游戏客户端,流畅的用户体验都离不开高效的线程调度。现代操作系统…...

从零部署noVNC:一次完整的远程桌面服务搭建与排错实录

1. 为什么选择noVNC? 最近在帮朋友部署远程桌面服务时,发现很多传统VNC方案都需要安装客户端,操作复杂不说,兼容性还差。直到发现了noVNC这个神器,它直接用浏览器就能访问远程桌面,彻底解决了跨平台访问的痛…...