二十三种设计模式第十四篇--策略模式

策略模式:主要围绕一个类的行为或者其算法在运行时更改,也是一种行为型模式。

在软件开发中,我们经常遇到需要根据不同的情况选择不同算法或行为的情况。传统的做法是使用大量的条件语句来实现这种逻辑,但这样的实现方式往往难以维护和扩展。策略模式(Strategy Pattern)提供了一种优雅的解决方案,可以让我们灵活地处理多种算法和行为,同时提高代码的可维护性和可扩展性。

策略模式的意义

策略模式的主要目的是将算法的定义、实现和使用相互解耦,使得它们可以独立变化。它通过将不同的算法封装在独立的策略类中,并定义一个通用的接口或抽象类来统一它们的调用方式。这样一来,客户端只需要与通用接口交互,而不需要关心具体的算法实现细节。

策略模式的核心思想是将算法视为一个可互换的组件,客户端可以在运行时动态地选择适合的策略。这种灵活性使得策略模式特别适用于需要根据不同的条件或偏好来调整算法的情况。例如,一个电商平台可以根据用户的购买历史和偏好选择不同的优惠策略来计算商品的价格。

策略模式的实现

在策略模式中,我们通常会定义一个策略接口或抽象类,用于统一不同策略的调用方式。然后,针对每种具体的算法或行为,我们创建相应的策略类,实现策略接口,并提供具体的算法实现。

客户端在需要使用算法的地方,通过策略接口与具体的策略类进行交互。客户端可以根据实际需求,在运行时动态地选择合适的策略类,并将其注入到上下文对象中。上下文对象负责调用所选策略的算法,并返回结果给客户端。

这种结构使得我们可以灵活地添加新的策略类或修改现有的策略类,而不会对客户端代码产生影响。策略模式将算法的变化对客户端透明,使得客户端只需要关注业务逻辑,而不需要关心具体的算法实现。

策略模式的优点

使用策略模式可以带来多个优点:

  1. 灵活性和可扩展性:策略模式通过将算法封装在独立的策略类中,使得可以在运行时动态地选择和切换算法,而无需修改客户端的代码。这种灵活性使得系统更容易扩展和适应变化。
  2. 可维护性:策略模式将不同的算法或行为封装在独立的策略类中,使得代码结构清晰,易于理解和维护。每个策略类负责实现一个特定的算法,修改或调试一个策略对其他策略没有影响,降低了代码的复杂性。
  3. 代码复用:策略模式可以促进代码的复用。不同的策略类可以共享相同的接口或抽象类,从而使得相似的算法可以通过继承或实现来共享代码。这样可以避免代码的重复编写,提高开发效率。

策略模式的应用场景

策略模式在以下情况下特别适用:

  1. 当需要根据不同的条件或偏好选择不同算法或行为时,可以使用策略模式来灵活地切换和调整算法。

  2. 当有多个相似的算法或行为,但它们的实现细节不同,可以将每个算法封装在独立的策略类中,以提高代码的可读性和可维护性。

  3. 当某个算法的实现经常变化,或者希望在运行时动态地选择算法时,可以使用策略模式来避免频繁修改客户端的代码。

  4. 当需要将算法的定义、实现和使用相互解耦,以提高代码的模块化和可测试性时,策略模式也是一个很好的选择。

代码实现

在这里插入图片描述

public interface Strategy {public int doOperation(int num1, int num2);}
public class OperationAdd implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}
public class OperationMultiply implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}
public class OperationSubtract implements Strategy {@Overridepublic 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));context = new Context(new OperationMultiply());    System.out.println("10 * 5 = " + context.executeStrategy(10, 5));}
}

结论

策略模式是一种优秀的设计模式,它能够灵活地处理多种算法和行为,提高代码的可维护性、可扩展性和可测试性。通过将算法封装在独立的策略类中,并通过统一的接口来调用,我们可以使得算法的变化对客户端透明,从而降低了代码的耦合性。策略模式的应用可以让我们的代码更加灵活、可读和可维护,是值得推广和应用的一种设计模式。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【花雕】全国青少年机器人技术一级考试备考实操搭建手册9

随着科技的不断进步,机器人技术已经成为了一个重要的领域。在这个领域中,机械结构是机器人设计中至关重要的一部分,它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说,了解机械结构的基础知识,掌…

[MySQL]MySQL表的约束

[MySQL]表的约束 文章目录 [MySQL]表的约束1. 约束的概念2. 空属性(null/not null)3. 默认值(default)4. 列描述(comment)5. 填充零(zerofill)6. 主键(primary key)7. 自增长(auto_increment)8. 唯一键(unique)9. 外键(foreign key) 1. 约束的概念 数据库通过技术手段限制数据的…

ADS笔记,新旧两组仿真数据进行绘图和列表对比

做个笔记,以防遗忘 ADS版本:2023 原理图器件参数的不同,怎么进行对比观看,操作如下 目录 一、数据绘图对比二、数据列表对比 一、数据绘图对比 选择Simulation Setting 然后修改原理图器件的参数,再次重复之前的操作…

MySQL自治平台建设的内核原理及实践(上)

本文整理自美团技术沙龙第75期的主题分享《美团数据库攻防演练建设实践》,系超大规模数据库集群保稳系列(内含4个议题的PPT及视频)的第4篇文章。 本文作者在演讲后根据同学们的反馈,补充了很多技术细节,跟演讲&#xf…

核磁共振常用的文件格式介绍:NIfTI volume 格式 (*.nii), GIFTI 格式 (*.gii), CIFTI 格式 (*.nii)

核磁共振常用的文件格式介绍:NIfTI volume 格式, GIFTI 格式, CIFTI 格式 NIfTI volume 格式 (*.nii)GIFTI 格式 (*.gii)CIFTI 格式 (*.nii)自定义工作台 (wb_view) 文件:Scene file文件 (*.scene)规格文件 (*.spec)Spec file (*.border)Foci (*.foci)Trajectory file (*.t…

【数据结构】栈和队列详解

⭐️ 往期相关文章 ✨链接1:数据结构和算法的概念以及时间复杂度空间复杂度详解 ✨链接2:【数据结构】手撕顺序表 ✨链接3:【数据结构】手撕单链表 ✨链接4:【数据结构】双向带头循环链表 ⭐️ 栈和队列 🌠 栈 栈是…

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 6 日论文合集)

文章目录 一、分割|语义相关(15篇)1.1 Prompting Diffusion Representations for Cross-Domain Semantic Segmentation1.2 ZJU ReLER Submission for EPIC-KITCHEN Challenge 2023: Semi-Supervised Video Object Segmentation1.3 Multi-Modal Prototypes for Open-Set Semanti…

Kafka学习笔记(基础篇)

目录 Kafka简介 消息队列 Kafka的应用场景 消息队列的两种模型 Kafka集群搭建 Kafka的生产者/消费者/工具 Kafka的基准测试工具 Kafka Java API开发 生产者程序开发 消费者程序开发 生产者使用异步方式生产消息 Kafka中的重要概念 消费者组 幂等性 事务编程 Ka…

故障:启动修复无法修复你的电脑

有台笔记本很久没用了无法开机了,还是用的win7的系统,开机后提示我使用启动修复,但是失败了,提示我启动修复无法修复你的电脑 启动修复无法修复你电脑怎么办_自动修复电脑未正确启动的解决方法-win7之家 1、上网查了下…

图形学 | 期末复习(下)| games101笔记 | 补档

博客基于GAMES101-现代计算机图形学入门-闫令琪,但不是其完整笔记,基于复习要求有一定的删减。考试以图形学入门基本概念和核心研究内容为主,少量公式。即以论述概念为主,涉及少量算法。p13:3:12是对应的games101视频节点。 文章目…

解决printJS打印问题汇总

目录 一、打印预览表格列不全(Element的el-table组件) 1、打印设置“打印缩放” 2、修改el——table的底层代码(如果页面上有多个表格慎用) 一、打印预览表格列不全(Element的el-table组件) 问题描述&a…

zookeeper第一课-Zookeeper特性与节点数据类型详解

1、Zookeeper特性与节点数据类型详解 ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。 Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一…