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

代码中的设计模式-策略模式

假如我们有一段代码,有很多的if else

function executeAction(type) {if (type === 'A') {console.log('Action A');} else if (type === 'B') {console.log('Action B');} else if (type === 'C') {console.log('Action C');} else {console.log('Unknown action');}
}executeAction('A'); // 输出: Action A
executeAction('B'); // 输出: Action B
executeAction('C'); // 输出: Action C
executeAction('D'); // 输出: Unknown action

如果if else有很多很多, 那么代码就会变的非常不直观且难以维护

那对于这种情况有什么好的解决办法吗
这就引出了我们今天的主角: 策略模式

什么是策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它允许你定义一系列算法或行为,并将它们封装在独立的策略类中。然后,你可以根据需要在运行时选择不同的策略。这种模式特别适合处理复杂的条件逻辑,比如多个 if-else if 语句。

下面来看使用策略模式的解决方案

我们可以将每个条件分支封装在一个策略类中,然后在运行时选择合适的策略。

// 定义策略接口
class Strategy {execute() {throw new Error('You have to implement the method execute!');}
}// 具体策略A
class StrategyA extends Strategy {execute() {console.log('Action A');}
}// 具体策略B
class StrategyB extends Strategy {execute() {console.log('Action B');}
}// 具体策略C
class StrategyC extends Strategy {execute() {console.log('Action C');}
}// 默认策略
class DefaultStrategy extends Strategy {execute() {console.log('Unknown action');}
}// 策略上下文
class Context {constructor() {this.strategies = {'A': new StrategyA(),'B': new StrategyB(),'C': new StrategyC()};}executeAction(type) {const strategy = this.strategies[type] || new DefaultStrategy();strategy.execute();}
}// 使用策略模式
const context = new Context();
context.executeAction('A'); // 输出: Action A
context.executeAction('B'); // 输出: Action B
context.executeAction('C'); // 输出: Action C
context.executeAction('D'); // 输出: Unknown action

策略接口 (Strategy): 定义了一个 execute 方法,所有具体的策略类都必须实现这个方法。

具体策略类 (StrategyA, StrategyB, StrategyC, DefaultStrategy): 每个类都实现了 execute 方法,执行特定的操作。

策略上下文 (Context): 维护一个策略对象的映射,并根据传入的 type 选择合适的策略来执行。如果没有找到对应的策略,则使用默认策略。

使用策略模式: 通过 Context 类的 executeAction 方法来执行不同的策略。

这样实现有哪些好处

可扩展性: 如果需要添加新的策略,只需添加一个新的策略类,并在 Context 中注册即可,无需修改现有代码。

代码清晰: 将复杂的条件逻辑分解到不同的策略类中,使代码更易于理解和维护。

灵活性: 可以在运行时动态地选择不同的策略,而不需要修改代码。

相关文章:

代码中的设计模式-策略模式

假如我们有一段代码,有很多的if else function executeAction(type) {if (type A) {console.log(Action A);} else if (type B) {console.log(Action B);} else if (type C) {console.log(Action C);} else {console.log(Unknown action);} }executeAction(A); // 输出: Ac…...

后端Node学习项目-项目基础搭建

前言 各位好,我是前端SkyRain。最近为了响应公司号召,开始对后端知识的学习,作为纯粹小白,记录下每一步的操作流程。 项目仓库:https://gitee.com/sky-rain-drht/drht-node 因为写了文档,代码里注释不是很…...

Python | Leetcode Python题解之第538题把二叉搜索树转换为累加树

题目: 题解: class Solution:def convertBST(self, root: TreeNode) -> TreeNode:def getSuccessor(node: TreeNode) -> TreeNode:succ node.rightwhile succ.left and succ.left ! node:succ succ.leftreturn succtotal 0node rootwhile nod…...

【ZeroMQ 】ZeroMQ中inproc优势有哪些?与其它传输协议有哪些不同?

inproc 是 ZeroMQ 提供的一种传输协议,用于在同一进程内的不同线程之间进行高效的通信。与其他传输协议(如 tcp、ipc 等)不同,inproc 专门针对线程间通信进行了优化,具有极低的延迟和开销。以下是 inproc 的底层原理和…...

spark的学习-03

RDD的创建的两种方式: 方式一:并行化一个已存在的集合 方法:parallelize 并行的意思 将一个集合转换为RDD 方式二:读取外部共享存储系统 方法:textFile、wholeTextFile、newAPIHadoopRDD等 读取外部存储系统的数…...

一文了解Android SELinux

在Android系统中,SELinux(Security-Enhanced Linux)是一个增强的安全机制,用于对系统进行强制访问控制(Mandatory Access Control,MAC)。它限制了应用程序和进程的访问权限,提供了更…...

数据血缘追踪是如何在ETL过程中发挥作用?

在大数据环境下,数据血缘追踪具有重要意义,它能够帮助用户了解数据的派生关系、变换过程和使用情况,进而提高数据的可信度和可操作性。通过数据血缘追踪,ETL用户可以准确追溯数据的来源,快速排查数据异常和问题。 一、…...

跟我学C++中级篇——生产中如何调试程序

一、程序的BUG和异常 程序不是发布到生产环境就万事大吉了。没有人敢保证自己写的代码没有BUG,放心,说这种话的人,基本可以断定是小白。如果在开发阶段出现问题,还是比较好解决的,但是如果真到了生产上,可…...

Python爬虫实战 | 爬取网易云音乐热歌榜单

网易云音乐热歌榜单爬虫实战 环境准备 Python 3.xrequests 库BeautifulSoup 库 安装依赖 pip install requests beautifulsoup4代码 import requests from bs4 import BeautifulSoupdef get_cloud_music_hot_songs():url "http://music.163.com/#/discover/playlist…...

apk因检测是否使用代理无法抓包绕过方式

最近学习了如何在模拟器上抓取APP的包,APP防恶意行为的措施可分为三类: (1)反模拟器调试 (2)反代理 (3)反证书检验 第一种情况: 有的app检验是否使用系统代理&#xff0c…...

DevOps业务价值流:架构设计最佳实践

系统设计阶段作为需求与研发之间的桥梁,在需求设计阶段的原型设计评审环节,尽管项目组人员可能未完全到齐,但关键角色必须到位,包括技术组长和测试组长。这一安排旨在同步推进两项核心任务:一是完成系统的架构设计&…...

计算机网络——SDN

分布式控制路由 集中式控制路由...

开源数据库 - mysql - innodb源码阅读 - master线程(一)

master struct /** The master thread controlling the server. */void srv_master_thread() {DBUG_TRACE;srv_slot_t *slot; // 槽位THD *thd create_internal_thd(); // 创建内部线程ut_ad(!srv_read_only_mode); //断言 srv_read_only_mode 为 falsesrv_main_thread_proce…...

vscode ssh连接autodl失败

autodl服务器已开启,vscode弹窗显示连接失败 0. 检查状态 这里的端口和主机根据自己的连接更改 ssh -p 52165 rootregion-45.autodl.pro1. 修改config权限 按返回的路径找到config文件 右键--属性--安全--高级--禁用继承--从此对象中删除所有已继承的权限--添加…...

文件系统和日志管理 附实验:远程访问第一台虚拟机日志

文件系统和日志管理 文件系统:文件系统提供了一个接口,用户用来访问硬件设备(硬盘)。 硬件设备上对文件的管理 文件存储在硬盘上,硬盘最小的存储单位是512字节,扇区。 文件在硬盘上的最小存储单位&…...

云上拼团GO指南——腾讯云博客部署案例,双11欢乐GO

知孤云出岫-CSDN博客 目录 腾讯云双11活动介绍 一.双十一活动入口 二.活动亮点 (一)双十一上云拼团Go (二)省钱攻略 (三)上云,多类型服务器供您选择 三.会员双十一冲榜活动 (一)活动内容 &#x…...

【VScode】VScode内的ChatGPT插件——CodeMoss全解析与实用教程

在当今快速发展的编程世界中,开发者们面临着越来越多的挑战。如何提高编程效率,如何快速获取解决方案,成为了每位开发者心中的疑问。今天,我们将深入探讨一款颠覆传统编程体验的插件——CodeMoss,它将ChatGPT的强大功能…...

水库大坝安全监测预警方法

一、监测目标 为了确保水库大坝的结构安全性和运行稳定性,我们需要采取一系列措施来预防和减少因自然灾害或其他潜在因素所引发的灾害损失。这不仅有助于保障广大人民群众的生命财产安全,还能确保水资源的合理利用和可持续发展。通过加强大坝的监测和维护…...

深度学习:微调(Fine-tuning)详解

微调(Fine-tuning)详解 微调(Fine-tuning)是机器学习中的一个重要概念,特别是在深度学习和自然语言处理(NLP)领域。该过程涉及调整预训练模型的参数,以适应特定的任务或数据集。以下…...

qt QWebSocketServer详解

1、概述 QWebSocketServer 是 Qt 框架中用于处理 WebSocket 服务器端的类。它允许开发者创建 WebSocket 服务器,接受客户端的连接,并与之进行双向通信。WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议,它使得客户端和服务器之间的数…...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

JavaSec-RCE

简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性&#xff0c…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则&#xf…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...