行为型:策略模式
目录
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 { /* 实现方法 */ };
}
相关文章:

行为型:策略模式
目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、优化技巧 1、核心思想 目的:将算法(行为)抽象出来作为一系列策略类,使他们可以相互替换,使系统拥有“可插拔”扩展的能…...

知识宇宙-学习篇:开源项目 README 文档该如何写?
名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、README 文档的重要性1. 项目的第一印象2. 搜索引擎优化的重要载体 二、现代 RE…...

YOLOv12增加map75指标
YOLOv12源码:https://github.com/sunsmarterjie/yolov12 第一步:更改Val.py文件 地址:该文件在yolov12-main\ultralytics\models\yolo\detect下 首先定位到def get_desc(self):这个函数上 代码修正如下: def get_desc(self):&q…...

Avalanche 六期 Workshop 精华合集|Grant 机会、技术深度、项目实战一文回顾!
作为当前区块链技术的前沿代表,Avalanche 以其独特的高吞吐、低延迟、多链架构,为开发者提供了一种颠覆性的 Layer 1 解决方案。不同于传统的 EVM 兼容链,Avalanche 支持开发者自定义执行环境,灵活选择最适合自身业务需求的虚拟机…...

【MySQL】第九弹——索引(下)
文章目录 🌏索引(上)回顾🌏使用索引🪐自动创建索引🪐手动创建索引🚀主键索引🚀普通索引🚀唯一索引🚀复合索引 🪐查看索引🪐删除索引🚀删除主键索引…...

leetcode-295 Find Median from Data Stream
class MaxHeap {private heap: number[];constructor() {this.heap [];}// 插入元素并上浮调整push(num: number): void {this.heap.push(num);this.siftUp(this.heap.length - 1);}// 弹出堆顶元素并下沉调整pop(): number {const top this.heap[0];const last this.heap.p…...

【后端高阶面经:缓存篇】37、高并发系统缓存性能优化:从本地到分布式的全链路设计
一、缓存性能优化的核心价值与分层架构 (一)缓存的多维价值体系 延迟优化 内存访问速度(100ns) vs 磁盘数据库(10ms+),性能提升10万倍+案例:电商详情页通过缓存将响应时间从500ms降至50ms吞吐提升 单机Redis可支撑10万QPS,分担数据库压力案例:秒杀系统通过缓存拦截9…...
西门子 S1500 博途软件舞台威亚 3D 控制方案
西门子 S1500 PLC 是工业自动化领域的主流控制器,适合高精度、高可靠性的舞台威亚控制。下面为你提供基于博途 (TIA Portal) 软件的 3D 控制方案设计。 系统架构设计 舞台威亚 3D 控制系统通常包含以下组件: 硬件层: S1500 PLC 主机伺服驱动…...
洛谷 P3374 【模板】树状数组 1(线段树解法)
【题目链接】 洛谷 P3374 【模板】树状数组 1 【题目考点】 1. 线段树 线段树(Segment tree)是一种用来维护区间信息的数据结构。 线段树中每个结点代表一个区间 根结点代表整体区间。 叶子结点代表长为1的单位区间。 对于线段树中的每一个分支结点 [ l , r ] [l, r] [l,r]…...

欣佰特科技| SIL2/PLd 认证 Inxpect毫米波安全雷达:3D 扫描 + 微小运动检测守护工业安全
Inxpect 成立于意大利,专注工业安全技术。自成立起,便致力于借助先进雷达技术提升工业自动化安全标准,解决传统安全设备在复杂环境中的局限,推出获 SIL2/PLd 和 UL 认证的安全雷达产品。 Inxpect 的雷达传感器技术优势明显。相较于…...
大模型量化原理
模型量化的原理是通过降低数值精度来减少模型大小和计算复杂度。让我详细解释其核心原理:我已经为您创建了一个全面的模型量化原理详解文档。总结几个核心要点: 量化的本质 量化的核心是精度换性能的权衡——通过降低数值精度(FP32→INT8&a…...
dify-api的.env配置文件
源码位置:dify\api\.env 本文使用Dify v1.3.1。配置文件中各变量的详细信息表,如下所示: 变量英文名变量中文名默认值变量功能SECRET_KEY秘密密钥XXX用于安全地签署会话cookie的应用秘密密钥。确保在部署时使用强密钥。CONSOLE_API_URL控制…...

【Linux】Linux 操作系统 - 18 , 重谈文件(二) ~ 文件描述符和重定向原理 , 手把手带你彻底理解 !!!
文章目录 ● 文件描述符一 、Linux 系统对文件的管理(要知道)二 、什么是文件描述符 fd ?三 、再探文件被管理过程(重要)四 、文件描述符 0 、1、21. 文件描述符的分配原则2. 提前认识三个默认打开的文件 ● 重定向原理(重要)一 、重定向现象二 、深入剖析重定向现象(重要)1…...

第五十三节:综合项目实践-车牌识别系统
一、项目背景与意义 车牌识别系统(LPR)是智能交通领域的核心技术之一,广泛应用于停车场管理、违章抓拍、高速公路收费等场景。本文将通过Python+OpenCV实现一个完整的车牌识别系统,涵盖图像预处理→车牌定位→字符分割→字符识别四大核心环节。 二、系统架构设计 技术栈组…...
AI时代新词-AI伦理(AI Ethics)
一、什么是AI伦理? AI伦理(AI Ethics)是指在人工智能(AI)的设计、开发、部署和使用过程中,涉及的道德、法律和社会问题的综合考量。它关注AI技术对人类社会、文化、价值观以及个人权利的影响,并…...
湖北理元理律师事务所债务优化服务中的“四维平衡“之道
债务问题解决需要兼顾多方利益,湖北理元理律师事务所通过独特的服务模式,在法律、经济、心理、社会四个维度建立平衡点。 一、法律维度的专业把控 合规性审查: 合同效力认定 诉讼时效核查 担保责任界定 程序合法性: 所有协…...

Git Push 失败:HTTP 413 Request Entity Too Large
Git Push 失败:HTTP 413 Request Entity Too Large 问题排查 在使用 Git 推送包含较大编译产物的项目时,你是否遇到过 HTTP 413 Request Entity Too Large 错误?这通常并不是 Git 的问题,而是 Web 服务器(如 Nginx&am…...

第10章 网络与信息安全基础知识
网络概述 多模光纤的特点:成本低,宽芯线,聚光好,耗散大,低效,用于低速度、短距离的通信。 单模光纤的特点:成本高,窄芯线,需要激光源,耗散小,高效…...
GO语言学习(九)
GO语言学习(九) 上一期我们了解了实现web的工作中极为重要的net/http抱的细节讲解,大家学会了实现web开发的一些底层基础知识,在这一期我来为大家讲解一下web工作的一个重要方法,:使用数据库,现…...

go 访问 sftp 服务 github.com/pkg/sftp 的使用踩坑,连接未关闭(含 sftp 服务测试环境搭建)
前言 最近在使用 sftp 服务时,被告知发起了海量的连接,直接把服务器搞崩,ip 被封了。 这是啥情况? golang 写的代码,我就正常的访问 sftp 服务,连接使用过后也都关闭了,咋会出现连接一直连着…...

Linux多线程(二)之进程vs线程
文章目录 Linux进程VS线程进程和线程进程的多个线程共享关于进程线程的问题 重谈地址空间Linux线程周边的概念 Linux进程VS线程 进程和线程 进程是资源分配的基本单位(进程是承担分配系统资源的基本实体) 执行流也是资源!线程是进程内部的执…...
【MogDB】测试 ubuntu server 22.04 LTS 安装mogdb 5.0.11
测试 ubuntu server 22.04 LTS 安装mogdb 5.0.11 使用的操作系统镜像是 https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso 装好操作系统后,把root登录打开了,方便后续操作。 测试过程 使用官方命令在线安装ptk rootubuntu22…...
AI时代新词-数字孪生(Digital Twin)
一、什么是数字孪生(Digital Twin)? 数字孪生(Digital Twin)是一种通过创建物理实体的虚拟副本,并利用数据和算法来模拟、分析和优化物理实体的性能和行为的技术。数字孪生结合了物联网(IoT&am…...

【HW系列】—web常规漏洞(文件上传漏洞)
文章目录 一、简介二、危害三、文件检测方式分类四、判断文件检测方式五、文件上传绕过技术六、漏洞防御措施 一、简介 文件上传漏洞是指Web应用程序在处理用户上传文件时,未对文件类型、内容、路径等进行严格校验和限制,导致攻击者可上传恶意文件&…...

如何实现 C/C++ 与 Python 的通信
C/C 与 Python 的通信可以通过多种方式实现,如使用 C API、Ctypes、Cython、SWIG、Python.h 或基于共享库的调用等。其中,使用 Ctypes 方式最为简便,适合快速调用已有的 C 函数库。例如,通过将 C 代码编译为动态链接库(…...
python炸鱼船
import pygame, random # 加载库 from pygame.locals import * pygame.init() pygame.display.set_caption("炸渔船") canvas pygame.display.set_mode((700, 500)) bgpygame.image.load("bg.png") bgpygame.transform.scale(bg,(700,500))class Hero(py…...
使用AutoKeras2.0的AutoModel进行结构化数据回归预测
1、First of All: Read The Fucking Source Code import autokeras as ak import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error# 生成数据集 np.random.seed(42) x np.random.rand(1000, 10) # 生成1…...

好用但不常用的Git配置
参考文章 文章目录 tag标签分支新仓库默认分支推送 代码合并冲突处理默认diff算法 tag标签 默认是以字母顺序排序,这会导致一些问题,比如0.5.101排在0.5.1000之后。为了解决这个问题,我们可以把默认排序改为数值排序 git config --global t…...

ULVAC VWR-400M/ERH 真空蒸发器 Compact Vacuum Evaporator DEPOX (VWR-400M/ERH)
ULVAC VWR-400M/ERH 真空蒸发器 Compact Vacuum Evaporator DEPOX (VWR-400M/ERH)...
P1068 [NOIP 2009 普及组] 分数线划定
题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的 150% 划定,即如果计划录取 m 名志愿者…...