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

设计模式详解(十四)——策略模式

策略模式简介

策略模式定义
策略模式(Strategy Pattern)是一种行为型设计模式,它使能在运行时改变对象的行为。策略模式属于对象行为模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,且算法的变化不会影响使用算法的客户。策略模式使得算法可以独立于使用它的客户端变化。

策略模式包含以下角色:

  1. 策略接口(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。它定义了可供客户端使用的各种策略的方法。
  2. 具体策略(ConcreteStrategy):实现了策略接口的具体策略类,封装了具体的算法或行为。
  3. 上下文(Context):它是客户端和策略之间的桥梁,主要用于给客户端调用。使用一个策略接口的引用,其过程可以针对抽象策略接口编程。Context 将客户端的请求委托给策略对象来执行。

策略模式优缺点:
优点:

  1. 策略类之间自由切换:由于策略类实现的是同一个抽象,策略模式提供了对算法的自由切换,将算法的使用与算法的实现分离开来,使得算法独立于使用它的客户端变化。
  2. 扩展性:策略模式使得在运行时可以动态地改变对象的行为。可以不改动原有代码,增加一个新的策略对策略模式来说比较容易。降低了算法实现类与客户端的耦合度,提高了代码的可维护性和可扩展性。
  3. 简化单元测试:策略模式使得每一个算法都有自己的类,这样单元测试的时候,针对某一个具体算法测试的时候更加简单和方便。
  4. 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句

缺点:
1.客户端必须知道不同策略的存在:客户端必须了解不同策略,以便根据需求选择合适的策略对象,从而具有一定的复杂度。
2.增加了对象的数目:由于策略模式将算法单独提取出来封装成策略类,因此会增加系统中类的个数,,从而也具有一定的复杂度。
3.当策列类太多的话,维护策略类会有额外开销,因此策略类数量多了的话会比较麻烦。

使用场景

  1. 当一个系统有许多许多行为,或者一个系统需要根据运行时的情形使用不同的行为时。
  2. 当需要在不同时间应用不同的行为时,可以考虑使用策略模式。
  3. 当一个对象有很多的行为,并且这些行为在将来的版本中可能会发生变化时。

以下举一个策略模式的例子:
下面通过一个简单的例子来演示。比如我们出去玩时可以选择的出行策略有很多种:汽车、火车、飞机,,高铁等每种出行策略都有各自的使用方法,只要能到目的地,我们可以随意更换各种策略。

创建抽象策略角色(Strategy)

/*** 抽象策略角色*/
public interface ChooseMode {void getChoose();
}

创建具体策略角色:(ConcreteStrategy)

/*** 具体策略角色:汽车*/
public class Car implements ChooseMode {@Overridepublic void getChoose() {System.out.println("已选择交通方式,坐汽车。");}
}
/*** 具体策略角色:飞机*/
public class Plane implements ChooseMode {@Overridepublic void getChoose() {System.out.println("已选择交通方式,坐飞机");}
}
/*** 具体策略角色:火车*/
public class Trian implements ChooseMode {@Overridepublic void getChoose() {System.out.println("已选择交通方式,坐火车。");}
}

创建环境类(Context)

/*** 环境类*/
public class Choose {private ChooseMode chooseMode;public void setChooseMode(ChooseMode chooseMode) {this.chooseMode = chooseMode;}public void getChoose() {chooseMode.getChoose();}
}

创建客户端(Client)

public class Client {public static void main(String[] args) {Choose choose = new Choose();System.out.println("选择方案一出行:");choose.setChooseMode(new Car());choose.getChoose();System.out.println("选择方案二出行:");choose.setChooseMode(new Trian());choose.getChoose();System.out.println("选择方案三出行:");choose.setChooseMode(new Plane());choose.getChoose();}
}

输出结果如下所示:

选择方案一出行:
已选择交通方式,坐汽车。
选择方案二出行:
已选择交通方式,坐火车。
选择方案三出行:
已选择交通方式,坐飞机

在上述例子中,我们定义了三个具体的交通工具类(具体策略类),实现了抽象策略接口的getChoose方法。三种交通工具提供了三种不同的getChoose方法的实现,这三种不同的getChoose方法的就是一系列算法。 在环境类中,我们定义了抽象工具类的接口。最终再客户端选择需要的交通方式出行就能得到想要的策略方法。客户端只需要知道使用哪一个算法。使用策略模式,就可以切换算法和增加新的交通方式。

总而言之:
策略模式是一种行为型设计模式,它允许在运行时动态改变对象的行为。通过定义一系列可互换的算法,策略模式将算法与使用算法的客户端分离,从而提高代码的灵活性和可维护性。策略模式的核心在于将算法封装成独立的策略类,客户端则通过上下文类来调用这些策略。这种模式适用于多种算法或行为需要自由切换的场景,能有效减少条件语句的使用,简化单元测试。然而,它也可能增加对象的数量,且客户端需要了解不同策略的存在。总的来说,策略模式是一种强大且灵活的设计工具,有助于构建可扩展和可维护的软件系统。


以上代码下载请点击该链接:https://github.com/Yarrow052/Java-package.git

相关文章:

设计模式详解(十四)——策略模式

策略模式简介 策略模式定义 策略模式(Strategy Pattern)是一种行为型设计模式,它使能在运行时改变对象的行为。策略模式属于对象行为模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换…...

【牛客SQL快速入门】SQL基础(二)

一、高级查询 1. 计算函数 AVG AVG()为平均值函数,通过对表中行数计数并计算其列值之和,求得该列的平均值。 AVG() 可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。 Select avg(gpa) From user_profile COUNT COUNT()函数…...

利用Java代码调用Lua脚本改造分布式锁

4.8 利用Java代码调用Lua脚本改造分布式锁 lua脚本本身并不需要大家花费太多时间去研究,只需要知道如何调用,大致是什么意思即可,所以在笔记中并不会详细的去解释这些lua表达式的含义。 我们的RedisTemplate中,可以利用execute方…...

7/8电源连接器航空插头端子

概述 7/8电源连接器是一种工业电源连接器的规格型号之一,常见于工业领域的电力传输和连接应用。它的名称中的“7/8”代表连接器插头的直径尺寸,通常为7/8英寸。这种类型的连接器通常用于较大电流传输和较高功率设备的连接,具有较大的电流承载…...

华为OD-C卷-游戏分组[100分]

题目描述 部门准备举办一场王者荣耀表演赛,有 10 名游戏爱好者参与,分为两队,每队 5 人。 每位参与者都有一个评分,代表着他的游戏水平。为了表演赛尽可能精彩,我们需要把 10 名参赛者分为示例尽量相近的两队。 一队…...

【c++】优先级队列|反向迭代器(vector|list)

优先级队列的常用函数的使用 #include<iostream> #include<queue> using namespace std;int main() {priority_queue<int>st;st.push(1);st.push(7);st.push(5);st.push(2);st.push(3);st.push(9);while (!st.empty()){cout << st.top() << &qu…...

gocron定时任务管理

基于gocron定时任务建设 基础环境配置 golang安装 下载 wget https://dl.google.com/go/go1.21.6.linux-amd64.tar.gz export PATH$PATH:/usr/local/go/bin 下载gocron组件 wget https://github.com/ouqiang/gocron/releases/download/v1.5.3/gocron-v1.5.3-linux-amd64.tar.g…...

JCYZ H3CNE-RS+

JCYZ H3CNE-RS 20240413 20240413 https://www.h3c.com/cn/ 支持–软件下载–其他产品–模拟器官方下载 人才研学中心—技术认证—电子资料 按范围划分&#xff1a;局域网 城域网 广域网 按拓扑结构划分&#xff1a;总线型 环型 星型 树型 全网状 部分网状&#xff08;优缺点&a…...

太阳光光照试验耐久性老化试验使用太阳光模拟器系统

上海科迎法电气科技有限公司生产的太阳光模拟器系统主要应用于太阳能研究、材料研究、光伏组件测试、空间环境模拟器、植物生长研究、光热模拟等领域&#xff0c;主要表现特征为&#xff1a; 1. 太阳能研究&#xff1a;可用于模拟不同光照条件下太阳能电池的性能测试和研究&am…...

Centos 7.9.2009 下 Gitlab 完全卸载

一、linux版本&#xff1a;lsb_release -a 二、GtiLab 版本 # 查看gitlab的版本号 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 三、开始卸载 3.1&#xff0c;停止Gitlab 相关服务 # 停止所有GitLab相关服务&#xff1a; sudo gitlab-ctl stop# 移除GitLab包…...

Navicat Premium 16 for Mac/Win:数据库管理的全能之选

在数字化时代&#xff0c;数据库管理已成为各行各业不可或缺的一环。而Navicat Premium 16作为一款功能强大的数据库管理软件&#xff0c;无疑为数据库管理员和开发者提供了高效、便捷的解决方案。 Navicat Premium 16支持多种主流数据库系统&#xff0c;无论是MySQL、Postgre…...

使用腾讯云服务器如何搭建网站?新手建站教程

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网txyfwq.com整理使用腾讯云服务器建站教程&#xff0c;…...

抖音快手直播整蛊软件插件工具合集(多啦咪/梦歌)

哪一款整蛊直播软件靠谱呢&#xff1f; 相信很多粉丝宝宝们&#xff0c;在做抖音直播或者快手的都在找好用又便宜的直播整蛊插件或者软件&#xff0c;但是好用的几乎少之又少&#xff0c;今天梦歌给大家分享几个&#xff0c;目前在用的也亲测过的几个软件及插件工具给大家参考&…...

探究C++20协程(2)——取值、传值、销毁与序列生成器实现

序列生成器是一个非常经典的协程应用场景,尤其是在需要惰性生成数据或处理潜在无限的数据流时。 序列生成器概念&#xff1a;序列生成器允许程序按需生成序列中的下一个元素&#xff0c;而不是一次性计算整个序列。这种方式可以节省内存&#xff0c;并允许处理无限或未知长度的…...

【前端面试3+1】12 toktn验证过程、面向对象特性、webpack和vite的区别、【字符串中的第一个唯一字符】

一、token验证过程 用户登录&#xff1a;用户提供用户名和密码进行登录。服务器验证&#xff1a;服务器接收到用户提供的用户名和密码&#xff0c;进行验证。生成token&#xff1a;如果用户名和密码验证通过&#xff0c;服务器会生成一个token&#xff0c;通常包含一些加密的信…...

机器人瓶胚检测工作站(H3U脉冲轴控制)

1、变量定义 2、程序监控1 2、 程序监控2 3、程序监控3 机器人输送料和机构的动作安全尤为重要&#xff0c;下面我们讨论下安全联锁控制逻辑 4、相机拍照触发信号 5、相机拍照触发时序...

数字货币:未来金融的崭新篇章

一、数字货币是什么&#xff1f; 数字货币是一种基于区块链技术的货币&#xff0c;它通过去中心化的方式发行和交易&#xff0c;无需传统的金融机构参与。数字货币的交易过程公开透明&#xff0c;可以确保交易的真实性和不可篡改性。比特币、以太坊、瑞波币等是目前比较知名的…...

USACO18DEC部分题 补题报告

一、Convention S P5119 [USACO18DEC] Convention S 题意 给定大巴的数量&#xff0c;容量&#xff0c;奶牛的数量和到来的时间&#xff0c;要求合理安排大巴的发车时间使奶牛的等待时间最小&#xff0c;求出奶牛最大等待时间的最小值 思路 本题使用二分&#xff0c;输入之…...

聊一聊一些关于npm、pnpm、yarn的事

前言 整理了最近的闲聊&#xff0c;话题是前端各个包管理器&#xff0c;如果分享的不对或者有异议的地方&#xff0c;麻烦请及时告诉我~ 耐心看完&#xff0c;也许你会有所收获~ 概述 本文阅读时间&#xff1a;10-15分钟左右&#xff1b; 难度&#xff1a;初级&#xff0c…...

c语言多功能计算软件170

定制魏&#xff1a;QTWZPW&#xff0c;获取更多源码等 目录 题目 要求 主要代码片段 题目 设计一个计算器软件&#xff0c;具备如下功能提示界面。 要求 设计出界面&#xff0c;注意界面名称最后为自己的姓名&#xff1b;&#xff08;20分&#xff09;能够实现加、减、乘、…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...