策略模式(Strategy Pattern)在JAVA中的应用

设计模式是软件工程中的一套被广泛认可的解决特定问题的最佳实践。它们是在多年的软件开发实践中总结出的有效方法。策略模式是JAVA中常用的一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互换,让算法的变化独立于使用算法的客户。

 

## 1. 策略模式简介

 

策略模式的主要目的是定义一系列的算法,并将每一个算法封装起来,使它们可以互换。这样做的好处是算法可以独立于使用它的客户而变化。策略模式让算法的选择更加灵活,并且可以方便地扩展新的算法。

 

## 2. 模式的结构

 

策略模式主要包含以下几个角色:

 

- **上下文(Context)**:它是一个使用算法的角色,维护一个算法的引用。

- **抽象策略(Strategy)**:这是一个定义所有支持的算法的公共接口。

- **具体策略(Concrete Strategy)**:这些类实现了抽象策略定义的接口,并提供了具体的算法实现。

 

## 3. 模式的实现

 

以下是一个简单的JAVA示例,展示如何实现策略模式:

 

```java

// 抽象策略接口

public interface Strategy {

    public int doOperation(int num1, int num2);

}

 

// 具体策略A

public class StrategyA implements Strategy {

    @Override

    public int doOperation(int num1, int num2) {

        return num1 + num2;

    }

}

 

// 具体策略B

public class StrategyB implements Strategy {

    @Override

    public int doOperation(int num1, int num2) {

        return num1 - num2;

    }

}

 

// 具体策略C

public class StrategyC 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 Client {

    public static void main(String[] args) {

        Context context = new Context(new StrategyA());

        System.out.println("Strategy A result: " + context.executeStrategy(10, 5));

 

        context = new Context(new StrategyB());

        System.out.println("Strategy B result: " + context.executeStrategy(10, 5));

 

        context = new Context(new StrategyC());

        System.out.println("Strategy C result: " + context.executeStrategy(10, 5));

    }

}

```

 

在这个例子中,`Strategy` 是一个抽象策略接口,`StrategyA`、`StrategyB` 和 `StrategyC` 是具体策略类,它们实现了 `Strategy` 接口并提供了具体的算法实现。

`Context` 是上下文类,它维护一个 `Strategy` 类型的成员变量,用于执行具体的策略。客户端代码演示了如何根据不同的策略创建上下文对象,并执行相应的算法。

 

## 4. 模式的优点

 

- **算法封装**:策略模式将算法封装起来,使算法可以独立于使用它的客户而变化。

- **扩展性**:策略模式让算法的变化更加容易,并且可以方便地扩展新的算法。

- **消除条件判断**:使用策略模式可以将一系列的条件判断转化为一系列策略类,代码更加清晰。

 

## 5. 模式的使用场景

 

- 当一个系统需要动态地在运行时选择算法时。

- 当一个类内部有多种解决相同问题的算法,并需要根据条件选择最佳方案时。

- 当需要消除大量相互关联的条件语句时。

 

## 6. 结语

 

策略模式是一种非常实用的设计模式,它通过定义一系列算法,并将每一个算法封装起来,使它们可以互换。在JAVA开发中,合理运用策略模式可以有效地提高代码的灵活性和可扩展性,使得算法的选择和管理变得更加简单和直观。然而,也应注意策略模式可能带来的问题,如策略类数量较多时可能导致系统复杂度增加等,因此在实际应用中需要根据具体情况谨慎使用。

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

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

相关文章

GitHub提交PR

本教程只做开源代码库Github工程提交pr的教程,不做其他的深入的讲解 Github和Gitlab的操作类似,只不过Github叫PR,GitLab叫MR,基本上做法是一致的 以开源项目QuickChat为例 https://github.com/Binx98/QuickChat https://github…

C++项目 -- 负载均衡OJ(一)comm

C项目 – 负载均衡OJ(一)comm 文章目录 C项目 -- 负载均衡OJ(一)comm一、项目宏观结构1.项目功能2.项目结构 二、comm公共模块1.util.hpp2.log.hpp 一、项目宏观结构 1.项目功能 本项目的功能为一个在线的OJ,实现类似…

研发岗-统信UOS系统配置npm git等前端常用配置

第一步 获取root权限 配置环境等都需要用到root权限,所以我们先获取到root权限,方便下面的操作 下载软件 在UOS应用商店下载的所需应用 版本都比较低 安装node 官网下载了【arm64】的包,解压到指定文件夹,设置链接&#xff0…

苹果电脑启动磁盘是什么意思 苹果电脑磁盘清理软件 mac找不到启动磁盘 启动磁盘没有足够的空间来进行分区

当你一早打开苹果电脑,结果系统突然提示: “启动磁盘已满,需要删除部分文件”。你会怎么办?如果你认为单纯靠清理废纸篓或者删除大型文件就能释放你的启动磁盘上的空间,那就大错特错了。其实苹果启动磁盘的清理技巧有很…

STM32之HAL开发——CubeMX配置串行Flash文件系统

配置流程 在开始配置FATFS前,需要提前配置好RCC的时钟,以及时钟的频率,另外还要配置好Debug选项(选择串行) 选项介绍 文件系统适用于SD卡,Disk磁盘等,需要我们将对应的驱动打开才可以使用。 …

【vue】Pinia-2 安装Pinia,使用store

1. 安装Pinia 在项目路径下执行npm install pinia 在package.json中查看 2. 使用store 在main.js中添加 import { createPinia } from pinia const pinia createPinia()修改createApp方法 最后示例如下(三处修改) import { createApp } from vue //…

SimpleImputer缺失数据处理报错解决方案

作者Toby,来源公众号:Python风控建模,SimpleImputer缺失数据处理报错解决方案 今天有学员反馈缺失值代码报错,由于sklearn缺失值处理的包升级,下面把官网最新的缺失值处理代码奉上。 参考https://scikit-learn.org/st…

请把「睡一个好觉」,当成一天里最重要的事来管理

我发现许多人都有这么一种情况:明明知道睡眠很重要,但却总是有意无意地熬夜。 比如: 给自己排了太多的学习和工作量,一不小心就到了凌晨一两点; 总觉得过去的一天什么都没干,宁愿在网上闲逛,也不…

低代码开发平台权威推荐:创新开发、领跑市场!

Gartner是低代码领域的一家权威机构,该机构常常通过"魔力象限"的研究方法,评选全球范围内IT细分领域的产品,来帮助决策者提供重要的咨询建议。本文盘点了Gartner机构推荐的6款低代码平台:Zoho Creator、Mendix、Oracle、…

JVM结构化体系

目录 目录 1.JVM 简介 1.1. 如何理解 JVM 呢? 1.2. 市场主流 JVM 分析? 1.3. 为什么要学习 JVM? 1.4. 字节码底层是如何执行呢? 如何理解 JIT 呢? 为什么 JVM 中解释执行与编译执行的并存(混合模式&…

【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

🔥个人主页:Forcible Bug Maker 🔥专栏:C 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 前言 本篇主要内容:类的6个默认成员函数中的拷贝构造函数…

el-drawer二次封装进行可拖拽

1.想要的效果 鼠标放到上面出现箭头显示可拖拽得图标 2.代码实现 2.1封装成自定义指令 // drawerDragDirective.js // 定义指令 const drawerDragDirective {// 指令绑定时的处理函数bind(el, ) {const minWidth 300;const dragDom el.querySelector(.el-drawer);// 创…

掀起区块链开发狂潮!Scaffold-eth带你一键打造震撼DApp

文章目录 前言一、Scaffold-eth是什么?二、安装和配置1.准备工作2.安装3.配置开发环境 三、进阶使用1.放入自己的合约2.部署运行 总结 前言 前面的文章传送🚪:hardhat入门 与 hardhat进阶 在之前的文章中,我们已经探讨了使用Har…

设计模式系列:简单工厂模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS二次开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 目录 定义 特点 使用场景 优缺点 (1) 优点…

故障转移-redis

4.4.故障转移 集群初识状态是这样的: 其中7001、7002、7003都是master,我们计划让7002宕机。 4.4.1.自动故障转移 当集群中有一个master宕机会发生什么呢? 直接停止一个redis实例,例如7002: redis-cli -p 7002 sh…

保持微软Microsoft Teams始终在线的方案

保持微软Microsoft Teams始终在线的方案 背景方案 背景 目前使用微软Teams办公的小伙伴很多,但是长时间不操作电脑就被自动设置成离线状态。对于在电脑前学习书本或者在思考问题的小伙伴就显得不太友好,因为即使我们不操作电脑我们也时刻在电脑前&#…

定时器产生延时停止

1,需求: 当按下按钮SB1,输出信号为0N,指示灯点亮;按下按钮SB2,经过10s的延时后,指示灯熄灭 2,关闭使用定时的常闭触电

HG泄露(ctfhub)

工具准备:dirsearch、dvcs-ripper 网络安全之渗透测试全套工具篇(内含安装以及使用方法)_dvcs-ripper-CSDN博客 dvcs-ripper:一款perl的版本控制软件信息泄露利用工具,支持bzr、cvs、git、hg、svn... tree //树状…

APP开发_Android 与 js 互相调用

1 js 调用 Android 方法 当使用 JavaScript 调用 Android 原生方法时,主要涉及到 Android 的 WebView 组件,它允许你在 Android 应用中嵌入网页内容,并提供了 JavaScript 与 Android 代码交互的能力。 (1)创建JavaSc…

项目升级到jdk21后 SpringBoot相关组件的适配

了解到jdk21是一个LTS版本,可以稳定支持协程的功能。经过调研,将目前线上的jdk8升级到21,使用协程提升并发性能。 目前系统使用springBoot 2.0.3.RELEASE,并且引入了mybatis-spring-boot-starter、spring-boot-starter-data-redi…