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

Java设计模式之策略(Strategy)模式

策略(Strategy)设计模式定义了一系列算法,将它们封装起来,并且可以相互替换使用,从而使得算法可以独立于使用它的客户而变化。

什么是策略模式

策略(Strategy)设计模式是一种行为型设计模式,它允许在运行时动态地选择算法。策略模式将算法封装为算法族,从而可以在运行时根据需要选择不同的算法。策略模式将算法的定义与其使用分离,使得算法的形式可独立于其具体应用,这样就可以在不修改代码的情况下透明地改变算法。在 Java 中,策略模式通常使用接口或抽象类来定义不同的策略,然后在其具体实现类中分别实现各自的算法。

策略模式的使用场景

策略(Strategy)设计模式适用于以下情况:

  • 需要在运行时动态地改变对象的行为。
  • 有多个算法可选,客户端需要根据不同的需要选择不同的算法。
  • 一个类定义了多种行为,并且这些行为在类的方法中以多个条件语句的形式出现。这时候可以将每种条件分支转化为一个独立的策略。

策略模式的代码示例

下面是一个简单的示例,用于演示策略(Strategy)设计模式的使用:

// 定义策略接口
interface Strategy {public int doOperation(int num1, int num2);
}// 实现策略接口的具体实现类:加法策略
class OperationAdd implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}// 实现策略接口的具体实现类:减法策略
class OperationSubtract implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}// 实现策略接口的具体实现类:乘法策略
class OperationMultiply implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}// 定义上下文对象
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 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));}
}

在上面的代码中,我们定义了一个 Strategy 接口,该接口用于定义不同的算法。我们实现了三个具体的策略类:OperationAdd、OperationSubtract 和 OperationMultiply,分别对应加法、减法和乘法算法。每个具体策略类都实现了 Strategy 接口中的方法。

我们还定义了一个 Context 上下文对象,它包含了一个策略对象,可以根据不同的策略执行不同的算法。在 Context 对象中,定义了一个 executeStrategy 方法,根据当前策略对象执行相应的算法。

在客户端代码中,我们首先创建了一个 Context 对象,并使用 OperationAdd 策略执行加法算法。然后我们重新定义了 Context 对象,并使用 OperationSubtract 策略执行减法算法。最后,我们又重新定义了 Context 对象,并使用 OperationMultiply 策略执行乘法算法。

代码的运行结果为:

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

这是因为我们分别使用了三个不同的策略(加法、减法和乘法),并将它们用于 Context 对象中执行计算。最后,我们打印了每个计算的结果。

策略模式的实际应用

  1. Spring框架:Spring框架中的依赖注入(DI)和控制反转(IOC)机制允许在运行时动态选择不同的实现。通过在配置文件中配置不同的策略,可以在不修改代码的情况下实现选择不同的策略。

  2. Hibernate框架:Hibernate框架中的查询语言HQL(Hibernate Query Language)提供了不同的查询策略,通过选择不同的查询策略,可以根据需求选择合适的查询方式,以提高查询效率。

  3. Java集合框架:Java集合框架中的排序方法(Comparator)接口是策略模式的典型示例。使用排序策略接口,可以在不修改集合类的情况下,根据不同的条件进行排序。

总结

策略(Strategy)设计模式提供了一种能够在运行时动态地改变对象行为的解决方案。在策略设计模式中,将算法的实现与算法的使用者相分离,从而可以根据需要选择不同的算法。通过使用接口或抽象类来定义各种策略,可以在运行时动态选择合适的策略。这使得算法的改变能够以透明的方式进行,而不会影响客户端代码的实现。在实际软件开发中,策略设计模式被广泛应用,特别是在需要在运行时改变对象行为的场景中。

相关文章:

Java设计模式之策略(Strategy)模式

策略(Strategy)设计模式定义了一系列算法,将它们封装起来,并且可以相互替换使用,从而使得算法可以独立于使用它的客户而变化。 什么是策略模式 策略(Strategy)设计模式是一种行为型设计模式&a…...

Vue引入CDN JS或本地JS文件之后 使用报错

加载问题 正常情况 在public引入script - js文件加载 - 写入内存 - 使用 但使用之前 有可能这个文件还没执行写入内存或者还未加载完毕 此时 需要一个promiss解决 1. 引入script 在 public / index.html 文件内引入你的script标签 <script type"text/javascript"…...

NRF52832-扩展广播

nordic论坛 我想要设置广播名称为 “一二三四五”&#xff0c;当广播名称为FULL_NAME时&#xff0c;但是广播显示还是“一&#xff1f;”&#xff0c;“&#xff1f;”是乱码&#xff0c;后来打开nrf connect观察广播&#xff0c;在没连接的时候&#xff0c;点击一下&#xff0…...

springboot项目新增子module

1. 拉取项目 2. file-new-module 3. 选择版本 4. 1-2-3-4 5. 注释请求统一前缀 (SwaggerConfig.java)...

Python Web 开发及 Django 总结

title: Python Web 开发及 Django 总结 date: 2023-07-24 17:26:26 tags: PythonWeb categories:Python cover: https://cover.png feature: false Python 基础部分见&#xff1a;Python 基础总结 1. 创建项目 1.1 命令行 1、下载安装 Django 在终端输入 pip install djan…...

《向量数据库指南》:向量数据库Pinecone故障排除

目录 无法pip安装 空闲后索引丢失 上传缓慢或延迟高 批处理带来的高查询延迟 使用gRPC客户端进行Upsert限流 Pods已满 安全问题 CORS错误 本节介绍常见问题以及如何解决它们。需要帮助吗?在我们的支持论坛中提问。标准、企业和专用客户还可以联系支持人员寻求帮助。...

[86] 分割链表

题目链接&#xff1a;86. 分隔链表 - 力扣&#xff08;LeetCode&#xff09; 第一种方法&#xff1a;类似双指针 自己想的&#xff0c;不知道读者是否能看懂&#xff0c;参考注释 ListNode* partition(ListNode* head, int x) {ListNode* bigpos nullptr;ListNode* littlep…...

【python】 清空socket缓冲区

在Python中使用Socket进行网络通信时&#xff0c;可以通过调用socket.recv()函数来接收数据&#xff0c;数据会被存储在缓冲区中。有时候&#xff0c;可能想要先清空缓冲区&#xff0c;以便后续的数据不会被之前的数据影响。以下是一种清空Python Socket缓冲区的方法&#xff1…...

108、RocketMQ的底层实现原理(不需要长篇大论)

RocketMQ的底层实现原理 RocketMQ由NameServer集群、Producer集群、Consumer集群、Broker集群组成&#xff0c;消息生产和消费的大致原理如下: Broker在启动的时候向所有的NameServer注册&#xff0c;并保持长连接&#xff0c;每30s发送一次心跳Producer在发送消息的时候从Na…...

怎么把PDF转为word?1分钟解决难题

PDF文件在我们的电脑上应用非常广泛&#xff0c;由于其较高的安全性和兼容性&#xff0c;得到了广泛的认可。然而&#xff0c;对于一些人来说&#xff0c;PDF文件不能直接进行编辑和修改可能是一个问题。因此&#xff0c;通常我们需要将其转换为Word格式&#xff0c;以便在Word…...

Mysql权限-系统表user,db,talbes_priv,columns_priv详解

一、MySQL 权限场景 可以根据登录用户限制用户访问资源(库、表)可以根据登录用户限制用户的操作权限(能对哪些库、表执行增删改查操作)可以指定用户登录IP或者域名可以限制用户权限分配 二、Mysql五个层级权限级别分析 Mysql权限级别分为了五个层级&#xff0c;并且每个级别…...

GPT-4 模型详细教程

GPT-4&#xff08;Generative Pretrained Transformer 4&#xff09;是 OpenAI 的最新语言生成模型&#xff0c;其在各类文本生成任务中表现优秀&#xff0c;深受开发者和研究者喜爱。这篇教程将帮助你理解 GPT-4 的基本概念&#xff0c;并向你展示如何使用它来生成文本。 什么…...

智慧环保:创造绿色未来

随着全球环境问题的日益严重&#xff0c;智慧环保成为推动绿色发展的关键。智慧环保利用先进的技术手段和智能化设备&#xff0c;致力于解决环境问题&#xff0c;保护生态环境&#xff0c;实现可持续发展。它融合了物联网、人工智能、大数据等技术&#xff0c;将科技的力量与环…...

虚拟 DOM和render()函数和Vue.js模板语法

[TOC](虚拟 DOM和render()函数) 1. 虚拟DOM 虚拟DOM是Vue中非常重要的概念&#xff0c;它是一个虚拟的内存中的数据结构&#xff0c;用来表示真实的DOM树。Vue使用虚拟DOM来减少对真实DOM的操作次数&#xff0c;从而提高页面的性能。 虚拟DOM的工作原理如下&#xff1a; Vu…...

k8s Service网络详解(一)

k8s Service网络详解&#xff08;一&#xff09; 有关K8s网络的几个概念K8s网络模型k8s网络插件ServiceService的访问方式Service的种类无头服务&#xff08;Headless Services&#xff09;带选择算符的服务无选择算符的服务 Service的类型ClusterIPNodeportLoadBalancerExtern…...

抖音账号矩阵系统开发源码

一、技术自研框架开发背景&#xff1a; 抖音账号矩阵系统是一种基于数据分析和管理的全新平台&#xff0c;能够帮助用户更好地管理、扩展和营销抖音账号。 部分源码分享&#xff1a; ic function indexAction() { //面包屑 $breadcrumbs [ [tit…...

Python+Texturepacker自动化处理图片

前言 本篇在讲什么 PythonTexturepacker自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖Texturepacker工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &…...

K8s Service网络详解(二)

K8s Service网络详解&#xff08;二&#xff09; Kube Proxy调度模式Kube-proxy IptablesKube-proxy IPVS Service SelectorPod DNS种常见的 DNS 服务Kube-DNSCoreDNSCorefile 配置 DNS 记录DNS 记录 ServiceDNS 记录 PodDNS 配置策略 Pod 的主机名设置优先级 Ingress Kube Pro…...

Rust vs Go:常用语法对比

这个网站 可以列出某门编程语言的常用语法&#xff0c;也可以对比两种语言的基本语法差别。 在此对比Go和Rust 1. Print Hello World 打印Hello World package mainimport "fmt"func main() { fmt.Println("Hello World")} fn main() { println!("…...

Vlan端口隔离(第二十四课)

一、端口隔离 1、端口隔离技术概述 1)端口隔离技术出现背景:为了实现报文之间的二层隔离,可以将不同的端口加入不同的VLAN,但这样会浪费有限的VLAN ID资源。 2)端口隔离的作用:采用端口隔离功能,可以实现同一VLAN内端口之间的隔离。 3)如何实现端口隔离功能:只需要…...

如何5分钟配置绝区零全自动智能助手:释放游戏时间的终极指南

如何5分钟配置绝区零全自动智能助手&#xff1a;释放游戏时间的终极指南 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 还…...

边缘计算与云原生的融合:从中心到边缘

边缘计算与云原生的融合&#xff1a;从中心到边缘 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农&#xff0c;我深知边缘计算在现代应用中的重要性。随着物联网、5G 等技术的发展&#xff0c;边缘计算已经成为处理海量数据、降低延迟的关键技术。今天&#xff0c;我就来聊…...

Webfunny前端监控系统安全防护终极指南:SQL注入防护与API鉴权最佳实践

Webfunny前端监控系统安全防护终极指南&#xff1a;SQL注入防护与API鉴权最佳实践 【免费下载链接】webfunny_monitor 【免费社区版】【企业版】Webfunny是一款集全链路监控和埋点系统于一体的大数据分析系统&#xff0c;我们致力于解决线上的疑难杂症和精细化分析业务数据&…...

在ABAQUS中用SPH模拟倒酒过程,超有趣的小探索

ABAQUS模拟倒酒过程&#xff0c;酒用sph模拟最近在玩ABAQUS&#xff0c;突发奇想试试模拟倒酒过程&#xff0c;酒用SPH&#xff08;光滑粒子流体动力学&#xff09;方法来模拟&#xff0c;那效果简直绝了&#xff0c;跟大家分享分享我的折腾经历。 为啥选SPH模拟酒&#xff1f;…...

类器官 vs 器官芯片:下一代体外模型如何提升药物研发效率【曼博生物-CNBIO】

类器官与器官芯片&#xff08;OOC&#xff09;&#xff1a;临床前研究模型的新趋势 一、介绍 类器官与器官芯片&#xff08;OOC/MPS&#xff09;是当前体外模型研究的两大核心技术路线。:contentReference[oaicite:0]{index0} 类器官是三维微型器官&#xff0c;通常由干细胞…...

MAI-UI-8B应用场景解析:如何用AI自动分析软件界面与操作流程

MAI-UI-8B应用场景解析&#xff1a;如何用AI自动分析软件界面与操作流程 1. 理解MAI-UI-8B的核心能力 MAI-UI-8B是一款专为图形用户界面(GUI)分析而设计的AI模型。它能够像人类一样"看"懂软件界面&#xff0c;理解各种UI元素的功能&#xff0c;并预测用户可能的操作…...

vLLM推理引擎教程8-CUDA Graph内存池优化

1. CUDA Graph内存池优化原理 在vLLM这类大模型推理引擎中&#xff0c;CUDA Graph技术已经成为提升性能的标配方案。但很多开发者在使用过程中会遇到一个棘手问题&#xff1a;当需要处理不同batch size的请求时&#xff0c;显存碎片和重复分配会导致性能下降。这时候就需要引入…...

AutoGen Studio实战体验:基于Qwen3-4B模型打造智能问答助手

AutoGen Studio实战体验&#xff1a;基于Qwen3-4B模型打造智能问答助手 1. AutoGen Studio简介 AutoGen Studio是一个低代码界面&#xff0c;旨在帮助开发者快速构建AI代理、通过工具增强它们、将它们组合成团队并与之交互以完成任务。它基于AutoGen AgentChat构建——一个用…...

Leather Dress Collection 在软件测试中的应用:自动化生成测试用例与报告

Leather Dress Collection 在软件测试中的应用&#xff1a;自动化生成测试用例与报告 最近和几个做测试的朋友聊天&#xff0c;大家普遍吐槽一件事&#xff1a;写测试用例和整理测试报告&#xff0c;太费时间了。尤其是面对一个复杂的新功能&#xff0c;或者是一大堆历史遗留的…...

霜儿-汉服-造相Z-Turbo科研辅助:使用LaTeX撰写包含AI生成图像的学术论文

霜儿-汉服-造相Z-Turbo科研辅助&#xff1a;使用LaTeX撰写包含AI生成图像的学术论文 最近在帮一位研究传统服饰的朋友整理论文&#xff0c;遇到了一个挺有意思的问题。他们需要大量汉服的结构示意图和纹样分析图&#xff0c;但手绘耗时&#xff0c;找现成资料又很难完全匹配研…...