news 2026/4/18 12:03:40

行为型设计模式——策略模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
行为型设计模式——策略模式

策略模式是一种行为设计模式,定义了很多可封装的算法,不同算法可以在运行时相互替换。特别适合在大量if-else分支判断的场景。

特点

1、封装变化:将经常变化的算法部分独立出来

2、面向接口编程:定义算法接口,不同实现类提供具体算法

3、组合优于继承:通过组合方式使用策略,而不是通过继承

结构

策略模式结构包括三个部分:

Context(环境类)持有一个策略对象的引用,通过策略接口调用具体策略
Strategy(策略接口)定义所有支持的算法的公共接口
ConcreteStrategy(具体策略)实现策略接口的具体算法类

UML图如下:

代码示例

策略+工厂模式(使用工厂模式管理策略的创建) 实现消息发送渠道

import java.util.HashMap; import java.util.Map; // 策略工厂 class NotificationStrategyFactory { private static final Map<String, NotificationStrategy> strategies = new HashMap<>(); static { strategies.put("EMAIL", new EmailNotification()); strategies.put("SMS", new SmsNotification()); strategies.put("PUSH", new PushNotification()); } public static NotificationStrategy getStrategy(String type) { NotificationStrategy strategy = strategies.get(type.toUpperCase()); if (strategy == null) { throw new IllegalArgumentException("不支持的通知类型: " + type); } return strategy; } public static void registerStrategy(String type, NotificationStrategy strategy) { strategies.put(type.toUpperCase(), strategy); } } // 策略接口 interface NotificationStrategy { void send(String message, String recipient); } // 具体策略类 class EmailNotification implements NotificationStrategy { @Override public void send(String message, String recipient) { System.out.printf("发送邮件到 %s: %s%n", recipient, message); } } class SmsNotification implements NotificationStrategy { @Override public void send(String message, String recipient) { System.out.printf("发送短信到 %s: %s%n", recipient, message); } } class PushNotification implements NotificationStrategy { @Override public void send(String message, String recipient) { System.out.printf("发送推送通知到设备 %s: %s%n", recipient, message); } } // 上下文类 class NotificationService { public void sendNotification(String type, String message, String recipient) { NotificationStrategy strategy = NotificationStrategyFactory.getStrategy(type); strategy.send(message, recipient); } } // 使用示例 public class StrategyWithFactoryDemo { public static void main(String[] args) { NotificationService service = new NotificationService(); // 通过工厂获取策略 service.sendNotification("EMAIL", "您的订单已发货", "user@example.com"); service.sendNotification("SMS", "验证码: 123456", "13800138000"); service.sendNotification("PUSH", "您有一条新消息", "device_token"); // 动态注册新策略 NotificationStrategyFactory.registerStrategy("WECHAT", (message, recipient) -> System.out.println("微信通知: " + message)); service.sendNotification("WECHAT", "公众号更新", "wechat_user"); } }

适用场景

  1. 多种算法变体:系统需要在多种算法中选择一种

  2. 避免多重条件语句:减少复杂的if-else或switch-case语句

  3. 算法需要独立变化:算法的使用和实现需要解耦

  4. 客户端不需要知道具体实现:客户端只关心接口,不关心具体算法

优点

1、开闭原则:无需修改上下文即可引入新策略;2、消除条件语句:避免使用多重条件转移语句;3、提高可复用性:算法可以独立于上下文重复使用;4、提高灵活性:运行时可以动态切换算法;5、职责分离:算法实现和使用分离

缺点

1、策略类数量增加:每个策略都需要一个单独的类;2、客户端必须了解策略:客户端需要知道有哪些策略可用;3、通信开销:策略和上下文之间可能需要传递数据;4、增加复杂度:简单场景使用可能显得过度设计

注:和状态模式对比

策略模式改变对象行为,状态模式改变对象状态。策略模式处理可选的算法实现,状态模式管理核心状态转换。

特性策略模式状态模式
主要目的封装算法,让客户端选择封装状态,管理状态转换
切换控制由客户端主动控制由上下文或状态对象自动控制
状态感知策略之间通常不知道彼此状态之间知道并触发转换
典型应用可互换的算法实现状态驱动的行为变化
设计重点算法的可替换性状态转换的逻辑封装
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 3:23:45

训练中断怎么办?Qwen2.5-7B微调常见问题解决方案

训练中断怎么办&#xff1f;Qwen2.5-7B微调常见问题解决方案 在单卡环境下完成大模型微调&#xff0c;尤其是像Qwen2.5-7B这样参数量达70亿的模型&#xff0c;看似简单——镜像已预置、命令已写好、数据已备齐。但实际操作中&#xff0c;你很可能刚敲下回车&#xff0c;就遭遇…

作者头像 李华
网站建设 2026/4/18 0:23:13

AI 净界 - RMBG-1.4基础教程:Web界面操作完整使用流程

AI 净界 - RMBG-1.4基础教程&#xff1a;Web界面操作完整使用流程 1. 这不是PS&#xff0c;但比PS抠得更细 你有没有试过用Photoshop抠一张带飞散发丝的人像&#xff1f;放大到200%&#xff0c;钢笔工具画了半小时&#xff0c;边缘还是毛毛躁躁的。或者给一只金毛犬换背景——…

作者头像 李华
网站建设 2026/4/18 2:01:03

OFA-VE多模态推理平台实测:5步完成视觉逻辑关系分析

OFA-VE多模态推理平台实测&#xff1a;5步完成视觉逻辑关系分析 1. 这不是普通看图说话&#xff0c;而是让AI做逻辑判断 你有没有试过让AI回答“这张图里的人是不是在下雨天打伞”&#xff1f;很多模型只会说“图里有一个人、一把伞”&#xff0c;但不会判断“打伞”这个动作…

作者头像 李华
网站建设 2026/4/18 2:04:02

SenseVoice Small语音转文字指南:音频时长与GPU显存占用关系表

SenseVoice Small语音转文字指南&#xff1a;音频时长与GPU显存占用关系表 1. 什么是SenseVoice Small&#xff1f; SenseVoice Small是阿里通义实验室推出的轻量级语音识别模型&#xff0c;专为边缘设备和本地化部署场景设计。它不是简单压缩的大模型&#xff0c;而是从训练…

作者头像 李华
网站建设 2026/4/18 2:04:35

Godot PCK文件解析与资源提取全流程深度解析

Godot PCK文件解析与资源提取全流程深度解析 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 在游戏开发与逆向工程领域&#xff0c;二进制分析技术是解锁容器格式的关键。Godot引擎作为一款开源游戏…

作者头像 李华
网站建设 2026/4/17 7:14:54

Proteus仿真与STM32:构建高效环境监测系统的关键技术与挑战

Proteus仿真与STM32&#xff1a;构建高效环境监测系统的关键技术与挑战 在嵌入式系统开发领域&#xff0c;仿真技术已经成为缩短开发周期、降低硬件成本的重要手段。Proteus作为业界领先的电路仿真软件&#xff0c;与STM32系列微控制器的结合&#xff0c;为环境监测系统的开发…

作者头像 李华