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

news2024/11/15 15:42:31

策略模式是一种行为设计模式,它允许你定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。该模式让算法的变化独立于使用算法的客户。在实际开发中,策略模式可以帮助我们减少大量的 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.coloradmin.cn/o/2068334.html

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

相关文章

产品的需求分析

一、需求 1.需求概念 用户的预期与现实存在在差异 用户所期望的明确的解决方案 2.需求的常用形式 提问题 提目的 提方案 3.需求的来源 外部需求:用户、市场、其他竞品 内部需求:业务部门、产品经理 4.需求测试方法 定性方式:逻辑…

【生日视频制作】江边夜景游轮观光船霓虹灯AE模板修改文字软件生成器教程特效素材【AE模板】

游轮观光船生日视频制作教程AE模板修改文字特效软件生成器素材 怎么如何做的【生日视频制作】江边夜景游轮观光船霓虹灯AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频

鸿蒙(API 12 Beta3版)【使用Image完成图片接收器】图片开发指导依赖JS对象

图像接收类,用于获取组件surface id,接收最新的图片和读取下一张图片,以及释放ImageReceiver实例。 开发步骤 添加依赖 在进行应用开发之前,开发者需要打开native工程的src/main/cpp/CMakeLists.txt,在target_link_…

【Qt】Qt系统 | Qt事件| 鼠标事件

文章目录 鼠标事件鼠标点击事件鼠标释放事件鼠标双击事件鼠标移动事件 滚轮事件 在 Qt 中,鼠标事件是用 QMouseEvent 实现的。当在窗口中按下鼠标或者移动鼠标时,都会产生鼠标事件 鼠标事件 鼠标点击事件 鼠标按下时通过 虚函数 mousePressEvent() 来…

系统编程—进程

一、进程的概念 1.程序与进程的区别 程序:编译后产生的,格式为ELF的,存储于硬盘的文件。可以通过 readelf -s [文件名] 查看文件信息 …

使用OpenRewrite升级SpringBoot项目

使用OpenRewrite升级SpringBoot项目 什么是OpenRewrite? OpenRewrite是一个强大的开源自动化源代码重构工具,专为大规模代码库设计。它的核心理念是通过程序化的方式来改变源代码,而不是依赖于手动编辑或简单的查找替换。 OpenRewrite的主要特点和优势包括: 自动重构: Open…

Unity动画模块 之 Animator中一些常见参数

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 我发现我忘了写Animator了,正好有些不常用的参数还没怎么认识,笔记来源于唐老狮 1.状态窗口参数 2.连线参数…

Lesson05--C/C++内存管理

1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placement-new) 7. 常见面试题 1. C/C内存分布 为了方便管理内存被分为了以上的区域 我们来看下面的一段代码和相关问题 …

数据结构(邓俊辉)学习笔记】优先级队列 08——左式堆:结构

文章目录 1. 第一印象2. 堆之合并3. 奇中求正4. NPL5. 左倾性6. 左展右敛 1. 第一印象 在学习过常规的完全二叉堆之后,我们再来学习优先级队列的另一变种,也就是左式堆。所谓的左式堆,也就是在拓扑形态上更加倾向于向左侧倾斜的一种堆&#…

Vue3 项目结构

1.main.ts 2.简单写一个src下的结构 App.vue 根组件 <template><div class"app"><!-- html --><h1>你好啊!</h1></div> </template><script lang"ts"> //js 或 tsexport default {name:App,//组件名 }…

MySQL数据库锁机制(全面讲解)

目录 1、全局锁 1.1、全局锁使用语法 1.2、备份数据库&#xff08;不使用全局锁&#xff09; 2、表锁 2.1、读写锁 读锁 写锁 2.2、元数据锁&#xff08;meta data lock MDL&#xff09; 2.3、意向锁 3、行锁 3.1、共享锁和排他锁 共享锁&#xff08;S锁&#xff…

原来marker还能这么玩

在Web GIS开发中&#xff0c;Marker&#xff08;标记&#xff09;是一个基本但强大的工具。今天&#xff0c;我们将探讨如何通过不同的API调用&#xff0c;将Marker玩出新花样&#xff0c;让地图更加生动有趣。 最基础的Marker用法是在地图上标记一个具体位置。我们可以通过“m…

【Unity3D小技巧】Unity3D中实现对InputField的自定义输入限制实例

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 InputField是UGUI的文本输入框&#xff0c;自带的…

粘包,Telnet,SSH,Wireshark

一&#xff0c;粘包 原因&#xff1a;tcp为流式套接字&#xff0c;数据与数据间没有边界&#xff0c;导致多次数据粘到一起。 解决&#xff1a; 1.规定一些数据间的间隔符&#xff0c;"\aa","\r\n"; 2.可以指定要发送对象的数据长度。 3.自己将数据打包。 …

力扣:有效的数独

文章目录 需求分析结尾 需求 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08…

2024年最新最全的【大模型学习路线规划】从零基础入门到精通!

2024年最新最全的大模型学习路线规划&#xff0c;对于零基础入门到精通的学习者来说&#xff0c;可以遵循以下阶段进行&#xff1a; 文章目录 一、基础准备阶段数学基础&#xff1a;编程语言&#xff1a;深度学习基础&#xff1a; 二、核心技术学习阶段Transformer模型&#xf…

第2章-04-Request Header与Response Header

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

TortoiseGit使用教程

系列文章目录 文章目录 系列文章目录前言一、TortoiseGit下载安装二、使用步骤1.创建库1.需要上传的文件&#xff1a;不需要上传的文件&#xff1a; 2.拉取代码 前言 以前都是用svn&#xff0c;现在改用git Git是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&am…

IO进程day01(标准IO、缓存区)

目录 【1】标准IO 1》概念&#xff1a; 2》特点 【2】缓存区 1》全缓存&#xff1a;和文件相关 2》行缓存&#xff1a;和终端有关 3》不缓存&#xff1a;也就是没有缓存区&#xff0c;标准错误。 【1】标准IO 1》概念&#xff1a; 标准IO&#xff1a; 是在C库中定义的一…

Linux入门——10 信号

1.信号 1.信号------信号量&#xff08;两者没有任何关系&#xff09; 2.信号讲什么----->整个信号的生命周期 信号的产生-----信号的保存------信号的处理 之前的kill命令&#xff0c;用的就是信号。 kill -l查看系统支持的信号 名字本身就是宏&#xff0c;其实就是编…