行为型:策略模式

目录

1、核心思想

2、实现方式

2.1 模式结构

2.2 实现案例

3、优缺点分析

4、适用场景

5、优化技巧


1、核心思想

目的:将算法(行为)抽象出来作为一系列策略类,使他们可以相互替换,使系统拥有“可插拔”扩展的能力。

举例

1> 游戏卡带:可插卡式的游戏机

2> 计算器:固定是两个输入和一个输出的结构,不同的算法实现类(加、减、乘、除等)

3> 万能的USB口:不同设备捕获数据(如键盘设备捕获的是键盘指令数据,鼠标设备捕获的是坐标与点击指令数据,摄像头设备捕获的是视频流数据)

2、实现方式

2.1 模式结构

三个核心角色:

  •  Strategy(策略接口)​:定义通用的策略规范标准,包含在系统环境中并声明策略接口标准。
  • ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC……(策略实现)​:实现了策略接口的策略实现类,可以有多种不同的策略实现,但都得符合策略接口定义的规范。
  • Context(系统环境)​:包含策略接口引用的系统环境,对外提供更换策略实现的方法setStrategy()以及执行策略的方法executeStrategy(),其本身并不关心执行的是哪种策略实现。

2.2 实现案例

举例:电商促销策略

// 策略接口
public interface DiscountStrategy {double applyDiscount(double price);
}// 具体策略:无折扣
public class NoDiscount implements DiscountStrategy {@Overridepublic double applyDiscount(double price) {return price;}
}// 具体策略:8折
public class TwentyPercentOff implements DiscountStrategy {@Overridepublic double applyDiscount(double price) {return price * 0.8;}
}// 具体策略:满300减50
public class FullReduction implements DiscountStrategy {@Overridepublic double applyDiscount(double price) {return price >= 300 ? price - 50 : price;}
}// 上下文类(订单)
public class Order {private DiscountStrategy strategy;public void setStrategy(DiscountStrategy strategy) {this.strategy = strategy;}public double checkout(double price) {return strategy.applyDiscount(price);}
}// 客户端
public class Client {public static void main(String[] args) {Order order = new Order();order.setStrategy(new TwentyPercentOff());System.out.println("最终价格:" + order.checkout(400)); // 输出 320.0}
}

3、优缺点分析

优点:

  • 开闭原则:新增算法时无需修改现有代码,只需添加新策略类。

  • 解耦算法与业务逻辑:算法独立于客户端,易于扩展和维护。

  • 消除条件分支:避免代码中复杂的 if-else 逻辑。

  • 复用性:不同策略可被多个客户端共享使用。

缺点:

  • 类数量增加:每个策略需要一个类,可能导致类膨胀。

  • 客户端需了解策略差异:客户端需要知道不同策略的适用场景。

  • 性能开销:频繁切换策略可能带来对象创建和销毁的开销(可通过享元模式优化)。

4、适用场景

  • 多种算法需要动态切换

    • 例如:支付方式(支付宝、微信、银行卡)、排序算法(快速排序、归并排序)。

  • 需要隐藏算法实现细节

    • 例如:加密算法(AES、RSA)、数据压缩(ZIP、RAR)。

  • 替代复杂的条件分支

    • 例如:电商促销策略(满减、折扣、赠品)。

  • 系统需要灵活扩展新算法

    • 例如:机器学习模型的不同训练策略。

5、优化技巧

策略对象的创建优化

  • 若策略无状态,可复用为单例(如 Collections.sort() 中的 Comparator)。

结合Lambda简化代码

  • 在支持函数式编程的语言(如Java 8+),可用Lambda替代简单策略类。

context.setStrategy(data -> System.out.println("Lambda策略处理:" + data));

策略枚举化

  • 对于有限的策略集合,可使用枚举类实现策略模式。

public enum DiscountType implements DiscountStrategy {NO_DISCOUNT { /* 实现方法 */ },TWENTY_PERCENT { /* 实现方法 */ };
}

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

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

相关文章

计算机网络学习20250524

协议 格式—语法:数据结构或格式(怎么做)次序—时序:事件实现的顺序(做的顺序)行为动作—语义:发出什么控制信息,完成何种动作、做出何种应答 网络结构 网络边缘:主机…

Github 2025-05-24 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-05-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目2Dart项目1Tauri: 构建小型、快速和安全的桌面应用程序 创建周期:1673 天开发语言:Rust协议类型:Apache License 2…

数据结构之堆(topk问题、堆排序)

一、堆的初步认识 堆虽然是用数组存储数据的数据结构,但是它的底层却是另一种表现形式。 堆分为大堆和小堆,大堆是所有父亲大于孩子,小堆是所有孩子大于父亲。 通过分析我们能得出父子关系的计算公式,parent(child-1)/2&#xff…

0基础 Git 代码操作

将代码提交仓库: 准备工作​ ​注册 Gitee 账号​:确保你已注册并登录 Gitee。​创建仓库​:在 Gitee 上新建一个空仓库(如果尚未创建): 点击右上角 → 新建仓库。填写仓库名称、描述,选择公…

OpenAI大模型不听人类指令事件的技术分析与安全影响

OpenAI大模型不听人类指令事件的技术分析与安全影响 OpenAI大模型o3确实存在不遵从人类关闭指令的现象,这一行为已被第三方安全机构验证,但其本质是技术缺陷而非AI意识觉醒。帕利塞德研究所的测试显示,在100次实验中o3有7次成功绕过关闭指令…

软件工程期末速成--附带几道题

软件工程中的各种设计 瀑布模型: 定义:将软件生存周期的各项活动规定为依照固定顺序连接的若干阶段工作,形如瀑布流水,最终得到软件产品 系统流程图:系统流程图是描绘物理系统的传统工具,它的基本思想是用…

免费分享50本web全栈学习电子书

最近搞到一套非常不错的 Web 全栈电子书合集,整整 50 本,都是epub电子书格式,相当赞!作为一个被期末大作业和项目 ddl 追着跑的大学生,这套书真的救我狗命! 刚接触 Web 开发的时候,我天天对着空…

嵌入式学习笔记——day26

文件操作(续)目录操作 一、文件操作 1. lseek lseek 是一个用于在文件中移动文件指针的系统调用,通常用于在文件描述符所指向的文件中定位读取或写入的位置。它允许程序在文件中随机访问数据,而不是只能顺序读取或写入。 off_t …

LINUX安装运行jeelowcode前端项目

参考 JeeLowCode低代码社区,JeeLowCode低代码开发平台,JeeLowCode低代码开发框架,快速启动(VUE) 安装node 18 LINUX安装node/nodejs_linux安装node 安装到哪-CSDN博客 安装PNPM LINUX安装PNPM-CSDN博客 下载 git clone https://gitcode.com/jeelo…

【Redis】基本架构

1. 单线程模型 现在开启了三个redis-cli客户端同时执行命令。 客户端1设置一个字符串键值对: 127.0.0.1:6379> set hello world客户端2对counter做自增操作: 127.0.0.1:6379> incr counter客户端3对counter做自增操作: 127.0.0.1:…

[yolov11改进系列]基于yolov11的修改检测头为自适应特征融合模块为ASFFHead检测头的python源码+训练源码

【自适应空间特征融合模块ASFF介绍】 ASFF(Adaptive Spatial Feature Fusion)是一种自适应特征融合策略,旨在解决目标检测中不同尺度特征之间的冲突和不一致性。 ‌ 基本概念和原理 ASFF通过学习每个尺度特征的自适应融合权重&#xff0c…

机器学习——支持向量机SVM

机器学习——支持向量机 一、介绍1.概述1.1 概念1.2 SVM的优缺点 2.硬间隔2.1 求解间隔2.2 对偶问题 3.软间隔3.1 松驰变量3.2 对偶问题 4.核函数4.1 概念4.2 常见的核函数 二、代码实战1.实验要求2.具体实现2.1 词汇表加载2.2 邮件预处理函数2.3词索引转换为特征向量2.4 SVM 模…

Python 科学计算有哪些提高运算速度的技巧

在科学计算中提高 Python 运算速度的核心技巧包括:使用 NumPy 向量化操作、利用 Numba 加速函数、调用 C/C 扩展模块、应用多线程/多进程并行计算、使用 GPU 加速计算。其中,使用 NumPy 向量化是最基础且见效最快的优化方式。NumPy 利用底层 C 实现高效的…

React+Antd全局加载遮罩工具

下面是全局加载遮罩工具,功能:提供show和showWithDelay/hide方法用于显示/延时显示/隐藏遮罩,它还提供loading属性返回是否正在loading。通常用于耗时较长的操作,比如远端api调用。 如何用它,下面是个例子&#xff0c…

【机器学习基础】机器学习入门核心算法:GBDT(Gradient Boosting Decision Tree)

机器学习入门核心算法:GBDT(Gradient Boosting Decision Tree) 1. 算法逻辑2. 算法原理与数学推导2.1 目标函数2.2 负梯度计算2.3 决策树拟合2.4 叶子权重计算2.5 模型更新 3. 模型评估评估指标防止过拟合 4. 应用案例4.1 金融风控4.2 推荐系…

水墨色调中国风PPT模版分享

水墨色调中国风PPT模版分享:水墨中国风PPT模版https://pan.quark.cn/s/4368c537b1d2 第一套PPT模版​:主题是“爱莲说”,水墨风格封面。核心视觉是绿色莲蓬、白鹤、红色印章,文字有“爱莲说”等。适用文学或传统文化类演示。 ​第…

PBX、IP PBX、FXO 、FXS 、VOIP、SIP 的概念解析以及关系

PBX(Private Branch Exchange) 概念 :PBX 是专用交换机,是一种在企业或组织内部使用的电话交换系统。它允许内部用户之间以及内部用户与外部公共电话网络(PSTN)之间进行通信。例如,在一个大型企…

LabVIEW双光子荧光成像软件开发

双光子荧光成像技术在抑郁小鼠脑内丙二醛(MDA)和甲醛(FA)检测中的软件开发,基于 LabVIEW 平台构建从硬件控制、数据采集到图像处理的全流程系统。结合 5734 FPGA 实现实时图像处理,突出双光子成像的深度开发…

OSI模型中的网络协议

一、电子邮件协议:从SMTP到MIME的扩展 电子邮件系统的核心协议包括SMTP(Simple Mail Transfer Protocol)、POP3(Post Office Protocol)和IMAP(Internet Message Access Protocol),但…

流程自动化引擎:让业务自己奔跑

在当今竞争激烈的商业环境中,企业面临着快速变化的市场需求、日益复杂的业务流程以及不断增长的运营成本。如何优化业务流程、提升效率并降低成本,成为企业持续发展的关键问题。 流程自动化引擎(Process Automation Engine)作为一…