全网最简单的Java设计模式【九】策略模式-实战中最常用的设计模式之一

策略模式是一种行为设计模式,它允许你定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。该模式让算法的变化独立于使用算法的客户。在实际开发中,策略模式可以帮助我们减少大量的 if-elseswitch 条件判断语句,使代码更加灵活和易于维护。

前段时间我与大厂的几位朋友闲聊,策略模式是他们日常开发工作中最常用的设计模式之一。

一、策略模式的结构

策略模式主要涉及三个角色:

  • Context(环境类):环境类用于维护对策略对象的引用。
  • Strategy(抽象策略类):这是一个抽象类或接口,为所有的具体策略类声明了共同的接口。
  • ConcreteStrategy(具体策略类):实现了在抽象策略类中声明的算法或行为。

类图如下:
在这里插入图片描述

二、Java 代码实战

假设我们要开发一个简单的计算器程序,支持多种运算策略,如加法、减法和乘法。我们可以使用策略模式来设计这个程序。

1. 定义抽象策略类(Operation)

public interface Operation {  int calculate(int num1, int num2);  
}

2. 实现具体策略类

  • 实现加法策略
public class AddOperation implements Operation { @Override  public int calculate(int num1, int num2) {  return num1 + num2;  }  }
  • 实现减法策略
public class SubtractOperation implements Operation {  @Override  public int calculate(int num1, int num2) {  return num1 - num2;  }  }

3. 环境类(Calculator)

public class Calculator {  private Operation operation;  public Calculator(Operation operation) {  this.operation = operation;  }  public int executeOperation(int num1, int num2) {  return operation.calculate(num1, num2);  }  public void setOperation(Operation operation) {  this.operation = operation;  }  
}

示例代码说明:

  • Operation:这是一个抽象策略接口,定义了一个计算方法 calculate,所有的运算策略都必须实现这个方法。
  • AddOperationSubtractOperation:这两个类实现了 Operation 接口,分别提供了加法、减法的实现。
  • Calculator:这是环境类,它持有一个 Operation 的引用,可以在运行时动态地改变运算策略。

4. 使用示例

1)示例代码

public class StrategyPatternDemo {  public static void main(String[] args) {  Calculator calculator = new Calculator(new AddOperation());  System.out.println("10 + 5 = " + calculator.executeOperation(10, 5));  calculator.setOperation(new SubtractOperation());  System.out.println("10 - 5 = " + calculator.executeOperation(10, 5));  }  
}
  • 在这个示例中,我们首先使用 加法策略 进行计算,然后通过 setOperation 方法动态地改变策略为 减法,展示了策略模式的灵活性和可替换性。

2)运行结果

10 + 5 = 15
10 - 5 = 5

总结

策略模式是一种非常实用的设计模式,它可以帮助我们减少大量的 条件判断语句,使代码更加灵活和易于维护。通过定义一系列的算法族,并将每一个算法封装起来,使它们可以互相替换,策略模式让算法的变化独立于使用算法的用户。在实际开发中,我们可以根据需要使用策略模式来优化代码结构。

遇见即是缘分,关注🌟、点赞👍、收藏📚,让这份美好延续下去!

🌟 更多技术管理学习路径 请关注下方 【技术管理修行】

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

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

相关文章

premiere2023暴力压缩视频

目录 1. 需求说明2. 压缩流程 1. 需求说明 要将三段视频拼接起来,时长超过了1h,然后压缩到200M以内的视频。 这是三段视频的信息: 合并三个视频文件意味着总时长增加了。较长的视频文件通常也会更大,即使比特率相同。 当我把三段…

vscode 阅读linux内核(vscode+clangd)

此插件曾在vim里用过,非常好用。 首先先在vscode 里下载clangd插件 这只是客户端,还需下载个服务器(这在coc插件里也有说明) sudo apt install clangd 下载完后可以 clangd --version 查看版本信息,如果能查看&#x…

UE5 日期时间蓝图变量 加减节点

参考链接:Having troubles with DateTime in UE5 - General / Feedback & Requests - Epic Developer Community Forums (unrealengine.com) 直接粘贴到UE5蓝图图表可用。(反之相加,用负号操作一下) 减号蓝图节点(…

8.22-docker的部署及其使用

docker 1.docker环境部署以及语法 [rootdocker ~]# cat << EOF | tee /etc/modules-load.d/k8s.conf> overlay> br_netfilter> EOFoverlaybr_netfilter[rootdocker ~]# modprobe overlay[rootdocker ~]# modprobe br_netfilter[rootdocker ~]# cat /etc/module…

AI绘画工具 Stable Diffusion【插画转绘】:建筑 | 风景| 人像照片的插画转绘制作教程,照片秒变插画风格图片!

大家好&#xff0c;我是画画的小强 关于Stable Diffusion 的插画转绘&#xff0c;今天给大家分享一种制作方法。我们先看一下效果图。 一. 图片转插画的制作方法 本期教程我们将使用AI绘画工具Stable Diffusion&#xff0c;关于SD的安装和入门使用可以看看我的往期入门教程…

122-域信息收集应用网络凭据CS插件AdfindBloodHound

参考&#xff1a;【内网安全】域信息收集&应用网络凭据&CS插件&Adfind&BloodHound_ladon adfinder bloodhound-CSDN博客 工作组和域环境 我的理解&#xff1a; 工作组就是还是局域网一样只是大一点里面的电脑很多&#xff0c;每个电脑还是都是单独的电脑没有…

解决arcmap发布影像切片,注册传输数据慢的问题

1、本地服务器进行切片步骤&#xff1a; 开发环境按照正常方案发布影像切片。 2、生产环境切片步骤 a、使用范文等同影像文件范围的矢量面数据&#xff0c;作为切片数据发布切片服务 重点&#xff1a;【服务名称必须一致】 b、获取开发环境切片的切片方案文件conf.xml 重点&am…

SSL/TLS协议信息泄露漏洞修复

概述&#xff1a;CVE-2016-2183 是一个涉及 SSL/TLS 协议信息泄露的漏洞&#xff0c;也被称为 "SWEET32" 攻击。该漏洞利用了某些对称加密算法&#xff08;如 3DES&#xff09;的弱点&#xff0c;攻击者可以通过捕获和分析大量的加密流量&#xff0c;可能会恢复明文数…

矩阵--旋转图像

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 &#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&a…

数据结构——算法和算法分析

目录 算法和算法分析 算法 算法设计的要求 算法效率的度量 算法的存储空间需求 算法和算法分析 算法 算法是对特定问题求解步骤的一种描述&#xff0c;它是指令的有限序列&#xff0c;其中每一条指令表示一个或多个操作。 一个算法具有下列5个重要的特性&#xff1a; &…

Python3:多行文本内容转换为标准的cURL请求参数值

背景 在最近的工作中&#xff0c;经常需要处理一些接口请求的参数&#xff0c;参数来源形式很多&#xff0c;可能是Excel、知识库文档等&#xff0c;有些数据形式比较复杂&#xff0c;比如多行或者包含很多不同的字符&#xff0c;示例如下&#xff1a; **客服质检分析指引** …

BaseCTF [第一周]Ez Xor

笔记。 64ida打开。 走&#xff01; 逆向逆向&#xff0c;逆向往前看。 因为异或算法&#xff0c;A ^BC >>> C^BA 所以在只需要知道密钥key就可以了。 是不是头大&#xff1f; 没事 这里介绍另一种方法>>> IDA 动态调试去获取key值、密文值 。(灵活使用工…

【MATLAB源码-第253期】基于matlab的8PSK调制载波+相位+符号定时联合估计仿真,输出星座图等。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 系统背景和目标 8PSK是一种调制方式&#xff0c;其中信号的相位被分成8个不同的状态&#xff0c;每个状态代表3比特的数据。这个过程涉及将比特序列转换为相应的相位&#xff0c;经过调制后传输给接收端。在接收端&#…

硬件检测工具箱 | 入梦工具箱 v8.8

入梦工具箱&#xff08;RM Toolbox&#xff09;是一款专为硬件检测、评分和测试设计的免费开源软件。它以其小巧的体积和简洁的界面&#xff0c;迅速成为DIY玩家和硬件爱好者的首选工具。 功能特点 集成常用硬件检测工具&#xff1a;包括CPUZ、GPUZ、AIDA64等&#xff0c;全面…

HTML5简洁的通用网站模板源码

文章目录 1.设计来源1.1 主界面1.2 模板页面11.3 模板页面21.4 模板页面31.5 模板页面41.6 模板页面5 2.效果和源码2.1 动态效果2.2 源码目录2.3 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/1413235…

微服务CI/CD实践(一)环境准备及虚拟机创建

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;gitlabs部署 微服务CI/CD实践&#xff08;三&#xff09;nexus3部署 微服务CI/CD实践&#xff08;四&#xff09;数据库,redis,n…

JWT-JSON Web Token

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案。 1 跨域认证的问题 互联网服务离不开用户认证。一般流程是下面这样。 用户向服务器发送用户名和密码。服务器验证通过后&#xff0c;在当前对话(session)里面保存相关数据&#xff0c;比如用…

Golang | Leetcode Golang题解之第357题统计各位数字都不同的数字个数

题目&#xff1a; 题解&#xff1a; func countNumbersWithUniqueDigits(n int) int {if n 0 {return 1}if n 1 {return 10}ans, cur : 10, 9for i : 0; i < n-1; i {cur * 9 - ians cur}return ans }

机器学习辅助复合材料预测,性能管理优化创新材料,这种王炸般的组合,还真是大开眼界!

在人工智能与复合材料技术融合的背景下&#xff0c;复合材料的研究和应用正迅速发展&#xff0c;创新解决方案层出不穷。从复合材料性能的精确预测到复杂材料结构的智能设计&#xff0c;从数据驱动的材料结构优化到多尺度分析&#xff0c;人工智能技术正以其强大的数据处理能力…

xss GAME (xss漏洞攻击1-8)

目录 xss网页链接 第一关 第二关 第三关 ​编辑第四关 ​编辑第五关 ​编辑第六关 第七关 第一种 Function构建函数 第二种 tostring parseInt 第三种 silce() ​编辑第八关&#xff08;安全过滤框架 dom破坏&#xff09; xss网页链接 XSS Game - Learning XSS Ma…