设计模式: 行为型之策略模式(16)

16_策略模式 策略模式是一种行为型设计模式,它将算法封装为独立类,使它们可以互相替换。该模式包含策略接口、具体策略实现类和上下文类三个主要角色,通过组合方式实现算法与使用者的解耦。策略模式适用于需要在运行时切换算法、避免大量条件判断的场景,提高了代码的灵活性和可维护性,但会增加系统复杂度和对象数量。示例代码展示了如何通过策略模式实现不同的排序算法,并在运行时动态切换策略。 阅读详情

策略模式概述

  • 策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为
  • 该模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

策略模式应用

// 首先,定义策略接口或抽象类
interface Strategy {
  execute(data: number[]): number;
}

// 创建各种具体的策略类,实现策略接口
class AdditionStrategy implements Strategy {
  execute(data: number[]): number {
    return data.reduce((a, b) => a + b, 0);
  }
}

class MultiplicationStrategy implements Strategy {
  execute(data: number[]): number {
    return data.reduce((a, b) => a * b, 1);
  }
}

class AverageStrategy implements Strategy {
  execute(data: number[]): number {
    return this.executeWithReduction(data, (sum, count) => sum / count);
  }

  private executeWithReduction(data: number[], reducer: (sum: number, count: number) => number): number {
    const sum = data.reduce((a, b) => a + b, 0);
    return reducer(sum, data.length);
  }
}

// 定义上下文类,维护策略并执行策略方法
class Context {
  private strategy: Strategy;

  constructor(strategy: Strategy) {
    this.strategy = strategy;
  }

  public setStrategy(strategy: Strategy): void {
    this.strategy = strategy;
  }

  public executeStrategy(data: number[]): number {
    return this.strategy.execute(data);
  }
}

// 使用示例
function main() {
  const numbers = [1, 2, 3, 4, 5];

  const context = new Context(new AdditionStrategy());
  console.log("Addition result:", context.executeStrategy(numbers)); // 输出:15

  context.setStrategy(new MultiplicationStrategy());
  console.log("Multiplication result:", context.executeStrategy(numbers)); // 输出:120

  context.setStrategy(new AverageStrategy());
  console.log("Average result:", context.executeStrategy(numbers)); // 输出:3
}

main();
  • 在这个例子中:Strategy 是一个接口,定义了所有策略都需要实现的公共方法 execute
  • AdditionStrategy、MultiplicationStrategy 和 AverageStrategy 是具体的策略类,它们都实现了 Strategy 接口
  • Context 类是使用策略的上下文,它持有一个策略对象,并提供了 setStrategy 方法用于切换策略,以及 executeStrategy 方法来执行当前策略
  • 在 main 函数中,我们创建了 Context 对象并设置了不同的策略,然后调用 executeStrategy 方法执行策略,观察到结果随着策略的改变而改变,体现了策略模式的灵活性

策略模式优缺点


1 )优点

  • 开闭原则:策略模式对扩展开放,对修改封闭。新的策略可以很容易地添加到系统中,而无需修改现有的代码

  • 多重条件逻辑简化:如果不用策略模式,你可能会在多个条件语句中有许多不同的算法。策略模式把这些算法分离到各自的类中,使代码更易于理解和维护

  • 客户端无需知道具体策略类:客户端只需要知道策略接口,无需关心具体的策略实现,降低了客户端与具体策略之间的耦合度

  • 多态性:策略模式利用多态性来切换算法,提高了代码的灵活性和可扩展性

  • 模块化:每个策略都是一个独立的模块,易于理解和测试

  • 消除条件判断:通过将行为封装在策略类中,可以消除大量条件语句(如 if-else 或 switch-case),从而简化客户端代码

  • 可配置性:策略模式使得用户可以根据需要在运行时选择合适的策略,提高了系统的灵活性

  • 降低耦合:策略模式将算法和使用算法的上下文分开,减少了两者之间的耦合度

2 )缺点

  • 客户端必须知道选择不同的策略(了解所有策略):客户端需要知道有哪些策略可供选择,并显式地选择策略。这可能会增加客户端的责任和复杂性

  • 增加对象数目:由于策略模式将每个具体的算法都单独封装为一个策略类,因此会增加系统中对象的数目

  • 策略间的通信复杂:如果策略间需要通信或共享数据,可能会导致额外的设计复杂性

  • 策略切换开销:频繁地在不同策略间切换可能带来一定的性能开销,尤其是在策略对象比较大的时候

  • 策略的选择逻辑:有时候策略的选择逻辑本身也可能变得复杂,尤其是当选择逻辑涉及到多个条件时,可能会退化为难以维护的条件分支代码

【软工方法论16】行为型设计模式策略模式全解析 摘要:策略模式解析 策略模式是一种行为型设计模式,用于封装可互换的算法,使它们能够独立变化。该模式通过将算法封装成独立的策略类,允许客户端动态选择不同策略,避免了使用复杂的条件语句。 核心特点: 定义策略接口,统一算法调用方式 每个具体策略实现独立算法 上下文类持有策略引用,通过委托执行算法 典型应用场景: 支付方式选择(支付宝/微信/银行卡) 排序算法切换(快速排序/归并排序) 折扣策略计算(无折扣/百分比折扣/满减) 优势: 消除条件分支语句 便于扩展新策略 提高代码可维护性 策略模式实现了开闭原则,是 阅读详情

相关推荐

【简易设计模式16】策略模式

总第68篇假如明天我要去东方明珠玩,我可以坐公交车,也可以乘地铁,还可以骑共享单车,更可以打出租车等等,选择什么样的交通工具不重要,重要的是能够到达目的地,我可以为自己的出行情况制定不同的出行方式和策略。在程序中,这种设计模式称作策略模式。本篇将详细梳理这种模式。1.策略模式的概念策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式。它定义一系列算法,将每个算法封装起来...

实战开发者Airex 182

JAVA设计模式(16):行为型-策略模式(Strategy)

俗话说:条条大路通罗马。在很多情况下,实现某个目标的途径不止一条,例如我们在外出旅游时可以选择多种不同的出行方式,如骑自行车、坐汽车、坐火车或者坐飞机,可根据实际情况(目的地、旅游预算、旅游时间等)来选择一种最适合的出行方式。在制订旅行计划时,如果目的地较远、时间不多,但不差钱,可以选择坐飞机去旅游;如果目的地虽远、但假期长、且需控制旅游成本时可以选择坐火车或汽车;如果从健康和环保的角度考虑,而且

The Best Or Nothing~ 8394

16.5:C++行为型设计模式的介绍和实现!(课程共5200字,4段代码举例)

在本课程中,我们全面而深入地学习了C++的行为型设计模式。通过掌握这些模式,我们可以更好地应对软件开发中的挑战,编写出高效、健壮和可维护的代码。然而,我们也要注意设计模式并非适用于所有情况,需要根据实际需求和情境进行灵活的选择和调整。同时,我们要注意设计模式的细微之处,如循环依赖、复杂命令逻辑和算法的变化等。只有在深入理解和应用设计模式的基础上,我们才能真正发挥设计模式的优势,构建出优秀的软件系统。

小兔子平安 213

设计模式分类

3.行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。2.结构型模式,共七种:适配器模式、装饰器模式、代理模式(jdk与cglib)、外观模式、桥接模式、组合模式、享元模式。1.创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

qq_33240556的博客 249

CTF逆向-[GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用

CTF逆向-[GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用 来源:https://buuoj.cn/ 内容: 附件:https://pan.baidu.com/s/1FKkXN6JDI0QkGw-UE2crNA?pwd=grb0 提取码:grb0 答案:Y0u_hav3_r3v3rs3_1t! 总体思路 发现是虚机模拟 形成每个指令的逆向 找到加密值位置(有可能不止一个位置,该题就给了一个误导的) 找到命令执行的流程(也是不止一个) 逆向编写反向加密得到f

serfend's blog 979

VSCode终端打不开?3分钟搞定Windows下Terminal配置(附最新JSON设置方法)

本文针对Windows系统下VSCode终端无法启动的常见问题,提供了详细的诊断与解决方案。核心在于更新已弃用的旧配置,采用最新的JSON设置方法,通过定义`terminal.integrated.profiles.windows`和指定`terminal.integrated.defaultProfile.windows`,快速修复并优化终端配置,实现三分钟内恢复正常使用。

flower的专栏 744

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

策略模式中,每一种算法都被单独的封装成一个策略,客户端通过上下文(Context)平滑地切换不同的算法类。简单来说策略模式就好比向客户提供多种可选方案,让客户自主选择需要执行哪种方案(具体算法类);他的优点也是其缺点,如果客户想根据自身的实际情况选择哪种方案,就必须了解提供的所有可选方案(算法类)的区别。意味着客户需具有统筹全局和精湛专业的能力,以便适时选择恰当的方案(算法类)。

qq_55610255的博客 1666

大语言模型(LLM)在组合优化中的新突破:LLM-LNS与FunSearch性能对比

本文深入探讨了大语言模型(LLM)在组合优化中的创新应用,重点对比了LLM-LNS与FunSearch两种方法的性能差异。研究表明,LLM-LNS在物流路径规划、资源调度等场景中展现出显著优势,其双层自演化架构能有效平衡探索与利用,相比传统方法提升效率约43%。文章还提供了实践选择指南,帮助开发者根据具体需求选用合适的技术方案。

weixin_42526415的博客 408

笨蛋学设计模式行为型模式-策略模式【16】

在购物平台上,我们需要实现一个促销活动功能。可以通过使用策略模式来实现不同类型的促销策略,比如折扣、满减、赠品等,每个促销策略可以被封装成一个独立的策略类,客户端根据不同的促销需求来选择不同的策略进行结算。

YSL_Monet的博客 1259

从零构建企业级多智能体系统:LangGraph 全流程实战 + 部署指南(含代码与架构图)

> 在大模型应用爆发的今天,如何构建一个可协作、可调试、可部署的多智能体系统?LangGraph 正在成为工程师的新宠。本文从原理剖析、流程建模、代码实战到前后端部署,手把手带你用 LangGraph 构建一个企业级 AI 助理系统,整合财务分析、法务审阅、报告生成与图表可视化等 Agent 模块,全面打通从用户输入到报告输出的全链路闭环。适合有工程思维的 AI 架构师、Agent 研发人员、以及大模型项目实践者。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3451

「UG/NX」BlockUI 控件集合目录大纲

Block UI Styler 模块设计对话框是官方推荐使用的对话框制作方法,它能够与NX自身风格相统一,在实际开发中经常使用。文字内容包含:NX所有控件介绍的链接、内部控件调用的基础介绍、官方案例查看路径、控件的特殊用法篇链接、番外篇链接。

何曾参静谧的博客 2676

技术成神之路:设计模式(六)策略模式

1.介绍策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,封装每一个算法,并使它们可以相互替换。策略模式使得算法的变化独立于使用算法的客户端。2.主要作用策略模式的主要作用是将算法或行为的选择从使用者中分离出来,使得可以在运行时选择不同的算法或行为。这种方式使得代码更加灵活、可扩展。3....

Salted fish in hand, I have the world. 1240

YOLOv8改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 1082

设计模式16_策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if......

江州司马 1837

MoveIt 运动学、运动规划、混合规划、move_group

混合规划是运动规划方法的一个术语,它将异构运动规划器结合起来,以产生更稳健或反应更快的解决方案。这种通用方法在导航领域已经非常成熟,并在导航2等流行项目中成功实施。MoveIt 的混合规划架构结合了一对全局规划器和局部规划器,它们以不同的规划速度和问题范围并行、并发运行。全局规划器的任务是解决全局运动规划问题,这与 “感知-规划-行动 ”应用中使用的规划器非常相似。所使用的规划器算法应该是完整的,因此假定其计算时间相对较慢。此外,全局规划器不要求实时安全,这意味着无法保证规划器在特定期限内找到解决方案。

机器人控制与仿真应用 2132

Pytorch入门实战(2)-使用BP神经网络实现MNIST手写数字识别

上一篇:Pytorch入门实战(1) - 实现线性回归 涉及知识点 Pytorch nn.Module的基本使用 Pytorch nn.Linear的基本用法 PytorchVision Transforms的基本使用 Pytorch中DataLoader的基本用法 Pytorch详解NLLLoss和CrossEntropyLoss 如何确定神经网络的层数和隐藏层神经元数量 本文内容 本文将会使用BP神经网络(就是最普通的神经网络)实现一个MNIST手写数据集的实现。话不多说,直接开始。 首先先导入需要的包

iioSnail的博客 6619

设计模式16——策略模式

1、定义算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

weixin_43687024的博客 1165

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

每天记录学习的新知识 :Android 设计模式之行为型

文章目录前言创建型行为型结构型行为型设计模式学习6. 策略模式7. 状态模式8. 观察者模式9. 中介者模式10. 访问者模式11. 迭代器模式12. 模板方法13. 备忘录模式14. 命令模式15. 解释器模式16. 职责链模式 前言 Android 的设计模式分为3大类,一个23种。 创建型 单例模式; 2. Builder模式; 3. 原型模式; 4. 工厂方法; 5. 抽象工厂 行为型 策略模式; 7. 状态模式; 8. 观察者模式; 9. 中介者模式; 10.

嗯... 471

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java设计模式之策略模式

在本文你能读到或者学习到: 1、战术大师泰伦卢的比赛策略; 2、设计模式之策略模式。

GitChat 1440

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【设计模式】行为型模式:策略模式

我这里只是举例说明,实际情况可能是,根据部门优惠,或者根据订单金额满减之类的,为了方便演示,所以我直接不同的策略优惠不同的金额,用于区分,下面直接上代码。最后,直接测试不同的策略模式,产生的不同结果。到此,策略模式在实际中的应用已经OK了。订单优惠接口,用于策略的统一标准。

Tellsea 354

设计模式之策略模式

1 违反开闭原则(OCP)// 新增支付方式需要修改原有代码if (type == "alipay") { /* 支付宝逻辑 */ }else if (type == "wechat") { /* 微信逻辑 */ }else if (type == "creditcard") { /* 信用卡逻辑 */ }else if (type == "coupon") { /* 优惠券逻辑 */ }// 新增PayPal支付需要在这里添加else if。

Anurmy的博客 464

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

策略模式(Strategy):   策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。 策略模式的角色:        1)环境类(Context):采用组合或聚合的方式维护一个对Strategy对象的引用。   2)抽象策略类(Strategy):定义所有支持的算法的公共接口。Context使用这个接口来...

marcushbs的博客 165

行为型模式之策略模式

策略模式

wanglj的博客 305

高级java每日一道面试题-2024年8月16日-设计模式篇-何时使用策略模式?

假设你正在开发一个电商系统,其中需要处理不同类型的支付方式,如信用卡支付、支付宝支付、微信支付等。每种支付方式的实现细节不同,但都实现了支付的基本功能。在这种情况下,你可以定义一个支付策略接口,然后为每种支付方式创建一个具体的策略类。客户端代码(如购物车结算模块)只需要知道如何使用支付策略接口,而不需要关心具体的支付实现。这样,如果将来需要添加新的支付方式,只需新增一个策略类即可,而无需修改现有的客户端代码。

qq_43071699的博客 597
上一篇: 设计模式: 行为型之模板方法模式(15)
下一篇: 设计模式: 行为型之命令模式(17)
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值