设计模式——策略模式(Strategy)

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时动态地改变一个对象的行为。策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。

策略模式的主要组成部分:

  1. 策略接口(Strategy):这是一个抽象策略类,通常由一个接口或抽象类实现。它声明了可供客户端调用的方法,以访问一个具体的策略对象。
  2. 具体策略类(ConcreteStrategy):这些类实现了策略接口,封装了具体的算法或行为。
  3. 上下文(Context):上下文类持有一个策略对象的引用。在上下文类中,通常包含一个策略接口类型的成员变量和一个设置该成员变量的方法(setter)。客户端通过调用这个设置方法来改变上下文对象的策略。上下文类还会提供一个与策略接口方法签名相同的方法,该方法内部会调用所包含的策略对象的方法。

策略模式的优点:

  1. 算法自由切换:策略模式允许在运行时动态地改变一个对象的行为,这使得算法可以自由切换。
  2. 开闭原则:策略模式遵循开闭原则,即对扩展开放,对修改封闭。你可以在不修改已有代码的情况下,通过增加新的策略类来扩展系统的功能。
  3. 减少if-else语句:策略模式可以有效地减少使用if-else语句或switch-case语句,使得代码更加清晰、易于维护。

策略模式的应用场景:

  1. 多种算法:当一个系统有多种算法,并且这些算法经常相互替换时,可以使用策略模式。
  2. 行为变化:如果一个类的行为在多种情况下需要变化,而且这些行为在运行时需要根据条件动态地改变,那么可以使用策略模式。
  3. 避免使用多重条件判断:当系统中出现多重条件判断语句时,可以考虑使用策略模式来替代这些条件判断语句。

示例代码(Java):

// 策略接口
public interface Strategy {
    int doOperation(int num1, int num2);
}

// 具体策略类A
public class OperationAdd implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

// 具体策略类B
public class OperationSubtract implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

// 上下文类
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}

// 客户端代码
public class StrategyPatternDemo {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationSubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    }
}

在这个示例中,我们定义了一个策略接口Strategy和两个具体策略类OperationAddOperationSubtract。我们还定义了一个上下文类Context,它持有一个策略对象的引用,并提供了一个方法来执行该策略。在客户端代码中,我们通过创建不同的上下文对象来改变策略,并执行相应的操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【时序大模型总结】学习记录(1)

1.TimeGPT-1 思路:在来自不同领域的大量数据上训练模型,然后对未见过的数据产生零样本的推断。 作者对TimeGPT进行了超过1000亿个数据点的训练,这些数据点都来自开源的时间序列数据。该数据集涵盖了广泛的领域,从金融、经济和天气…

YOLOv8原理解析[目标检测理论篇]

接下来是我最想要分享的内容,梳理了YOLOv8预测的整个流程,以及训练的整个流程。 关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了,为了更好地介绍本章内容,还是把YOLOv8网络结构图放在这里,方便查看。 1.YOL…

AI讲师大模型培训老师叶梓:大模型应用的方向探讨

大模型应用的关键方向及其落地案例可以从多个角度进行探讨,结合最新的研究和实际应用案例,我们可以更全面地理解这些技术如何推动社会和经济的发展。 Agent(数字代理): 方向说明:Agent方向的AI技术旨在创建能够独立执行任务、做出…

对于SOMP算法的测试

刚开始只上传了SOMP算法的代码,并没有过多介绍。 所以本篇文章对SOMP算法用法进行一个介绍 SOMP算法代码 function [X_hat] MMV_SOMP(Y, PHI, s)% SOMP:同时正交匹配追踪 simultaneous orthogonal matching pursuit% 论文:J. Determe, J. Lo…

若依plus 某些接口(用户信息等)响应突然变慢

今天一大早起来发现我的接口突然响应变慢了! 就什么都没动,啥也没改,但是一些接口又很快。 百度了很多,都说叫我改sql查询方式,又怀疑是过滤器的问题,很遗憾都不是! 一个响应40秒!…

[译文] 恶意代码分析:1.您记事本中的内容是什么?受感染的文本编辑器notepad++

这是作者新开的一个专栏,主要翻译国外知名安全厂商的技术报告和安全技术,了解它们的前沿技术,学习它们威胁溯源和恶意代码分析的方法,希望对您有所帮助。当然,由于作者英语有限,会借助LLM进行校验和润色&am…

IOT-9608I-L ADC端口的使用(连续采样ADC值)

目录 概述 1 硬件介绍 1.1 认识硬件 1.2 引脚信号定义 2 软件功能实现 2.1 查看iio:device0下的接口信息 2.2 实现连续采样ADC 2.2.1 功能描述 2.2.2 代码实现 2.2.3 详细代码 3 测试 概述 本文主要讲述IOT-9608I-L ADC端口的使用方便,其内容包括板卡上的…

密室逃脱游戏-第12届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第58讲。 密室逃脱游戏&…

2024年第九届数维杯数学建模B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…

分布式模式让业务更高效、更安全、更稳定

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🚀 转载自热榜文章🔥:探索设计模式的魅力:分布式模…

Ubuntu添加网络映射路径

参考资料 linux挂在阿里云盘(webdav协议)给服务器扩容、备份数据等_davfs2-CSDN博客 Linux将WebDAV为本地磁盘 - 夏日冰菓 (lincloud.pro) systemd系统开机运行rc.local_rc-local.service: failed to execute command: exec -CSDN博客 系统版本&#xff…

word格式技巧

文章目录 论文格式技巧论文交叉引用怎么弄论文的页码怎么弄 论文格式技巧 论文交叉引用怎么弄 1.取消文献原有的编号 2.定义新编号 3.具体编号设置 4.在引用的地方插入,具体引用选项卡–>交叉引用–>选择后插入 2. 4. 论文的页码怎么弄 假设我们有这样一…

List的两种实现

前置知识: 数组 baseAddress:数组的首地址 dataTypeSize:数组中元素类型的大小,如int为4字节 为什么数组索引从0开始,假如从1开始不行吗? 在根据数组索引获取元素的时候,会用索引和寻址公式来计…

HBase 读写流程

HBase 读写流程 1. 读流程 Client先访问zookeeper,从zookeeper获取meta region的位置从meta region中读取meta表中的数据,meta中存储了用户表的region信息;根据namespace、表名和rowkey在meta表中找到对应的region信息;找到这个r…

[Kotlin]创建一个私有包并使用

1.创建Kotlin项目 创建项目: 在Android Studio或其他IDE中选择“Create New Project”。选择Kotlin和Gradle作为项目类型和构建系统。指定项目名称和位置,完成设置。 添加依赖: 如果你的库需要额外的依赖,可以在 build.gradle (Module: app…

文件各种上传,离不开的表单 [html5]

作为程序员的我们,经常会要用到文件的上传和下载功能。到了需要用的时候,各种查资料。有木有..有木有...。为了方便下次使用,这里来做个总结和备忘。 利用表单实现文件上传 最原始、最简单、最粗暴的文件上传。 前端代码: //方…

oracle 清理 trace 和 alert 日志文件

某天,发现磁盘空间被占满了,继续查询发现是 oracle 的日志文件占满了磁盘空间 其中: trace文件有35G, alert 有23G 目录地址是: diag/rdbms/orcl/orcl/trace, diag/rdbms/orcl/orcl/alert 都是在 oracle 目录下的 diag 目录内部 # 可以使用 以下命令对目录大小进行排…

Git与GitHub交互

注册 https://github.com/ 本地库与远程库交互方式 创建本地库并提交文件 创建远程库 在本地库创建远程库地址别名 查看现有远程库地址的别名 git remote -v 创建远程库地址别名 git remote add [别名] [远程地址] 远程路地址位置 示例 成员1推送 git push [别名] [分支…

视频剪辑图文实例:一键操作,轻松实现视频批量片头片尾减时

视频剪辑是现代媒体制作中不可或缺的一环,而批量处理视频更是许多专业人士和爱好者的常见需求。在剪辑过程中,调整视频的片头片尾时长可以显著提升视频的质量和观感。本文将通过图文实例的方式,向您展示如何一键操作,轻松实现视频…

借助Aspose.SVG图像控件,在线将 PNG 转换为 Base64 字符串

Aspose.SVG for .NET 是用于SVG文件处理的灵活库,并且与其规范完全兼容。API可以轻松加载,保存和转换SVG文件,以及通过其文档对象模型(DOM)读取和遍历文件的元素。API独立于任何其他软件,使开发人员无需使用…
最新文章