设计模式详解(十四)——策略模式
策略模式简介
策略模式定义
策略模式(Strategy Pattern)是一种行为型设计模式,它使能在运行时改变对象的行为。策略模式属于对象行为模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,且算法的变化不会影响使用算法的客户。策略模式使得算法可以独立于使用它的客户端变化。
策略模式包含以下角色:
- 策略接口(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。它定义了可供客户端使用的各种策略的方法。
- 具体策略(ConcreteStrategy):实现了策略接口的具体策略类,封装了具体的算法或行为。
- 上下文(Context):它是客户端和策略之间的桥梁,主要用于给客户端调用。使用一个策略接口的引用,其过程可以针对抽象策略接口编程。Context 将客户端的请求委托给策略对象来执行。
策略模式优缺点:
优点:
- 策略类之间自由切换:由于策略类实现的是同一个抽象,策略模式提供了对算法的自由切换,将算法的使用与算法的实现分离开来,使得算法独立于使用它的客户端变化。
- 扩展性:策略模式使得在运行时可以动态地改变对象的行为。可以不改动原有代码,增加一个新的策略对策略模式来说比较容易。降低了算法实现类与客户端的耦合度,提高了代码的可维护性和可扩展性。
- 简化单元测试:策略模式使得每一个算法都有自己的类,这样单元测试的时候,针对某一个具体算法测试的时候更加简单和方便。
- 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句
缺点:
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/ 支持–软件下载–其他产品–模拟器官方下载 人才研学中心—技术认证—电子资料 按范围划分:局域网 城域网 广域网 按拓扑结构划分:总线型 环型 星型 树型 全网状 部分网状(优缺点&a…...
太阳光光照试验耐久性老化试验使用太阳光模拟器系统
上海科迎法电气科技有限公司生产的太阳光模拟器系统主要应用于太阳能研究、材料研究、光伏组件测试、空间环境模拟器、植物生长研究、光热模拟等领域,主要表现特征为: 1. 太阳能研究:可用于模拟不同光照条件下太阳能电池的性能测试和研究&am…...
Centos 7.9.2009 下 Gitlab 完全卸载
一、linux版本:lsb_release -a 二、GtiLab 版本 # 查看gitlab的版本号 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 三、开始卸载 3.1,停止Gitlab 相关服务 # 停止所有GitLab相关服务: sudo gitlab-ctl stop# 移除GitLab包…...
Navicat Premium 16 for Mac/Win:数据库管理的全能之选
在数字化时代,数据库管理已成为各行各业不可或缺的一环。而Navicat Premium 16作为一款功能强大的数据库管理软件,无疑为数据库管理员和开发者提供了高效、便捷的解决方案。 Navicat Premium 16支持多种主流数据库系统,无论是MySQL、Postgre…...
使用腾讯云服务器如何搭建网站?新手建站教程
使用腾讯云服务器搭建网站全流程,包括轻量应用服务器和云服务器CVM建站教程,轻量可以使用应用镜像一键建站,云服务器CVM可以通过安装宝塔面板的方式来搭建网站,腾讯云服务器网txyfwq.com整理使用腾讯云服务器建站教程,…...
抖音快手直播整蛊软件插件工具合集(多啦咪/梦歌)
哪一款整蛊直播软件靠谱呢? 相信很多粉丝宝宝们,在做抖音直播或者快手的都在找好用又便宜的直播整蛊插件或者软件,但是好用的几乎少之又少,今天梦歌给大家分享几个,目前在用的也亲测过的几个软件及插件工具给大家参考&…...
探究C++20协程(2)——取值、传值、销毁与序列生成器实现
序列生成器是一个非常经典的协程应用场景,尤其是在需要惰性生成数据或处理潜在无限的数据流时。 序列生成器概念:序列生成器允许程序按需生成序列中的下一个元素,而不是一次性计算整个序列。这种方式可以节省内存,并允许处理无限或未知长度的…...
【前端面试3+1】12 toktn验证过程、面向对象特性、webpack和vite的区别、【字符串中的第一个唯一字符】
一、token验证过程 用户登录:用户提供用户名和密码进行登录。服务器验证:服务器接收到用户提供的用户名和密码,进行验证。生成token:如果用户名和密码验证通过,服务器会生成一个token,通常包含一些加密的信…...
机器人瓶胚检测工作站(H3U脉冲轴控制)
1、变量定义 2、程序监控1 2、 程序监控2 3、程序监控3 机器人输送料和机构的动作安全尤为重要,下面我们讨论下安全联锁控制逻辑 4、相机拍照触发信号 5、相机拍照触发时序...
数字货币:未来金融的崭新篇章
一、数字货币是什么? 数字货币是一种基于区块链技术的货币,它通过去中心化的方式发行和交易,无需传统的金融机构参与。数字货币的交易过程公开透明,可以确保交易的真实性和不可篡改性。比特币、以太坊、瑞波币等是目前比较知名的…...
USACO18DEC部分题 补题报告
一、Convention S P5119 [USACO18DEC] Convention S 题意 给定大巴的数量,容量,奶牛的数量和到来的时间,要求合理安排大巴的发车时间使奶牛的等待时间最小,求出奶牛最大等待时间的最小值 思路 本题使用二分,输入之…...
聊一聊一些关于npm、pnpm、yarn的事
前言 整理了最近的闲聊,话题是前端各个包管理器,如果分享的不对或者有异议的地方,麻烦请及时告诉我~ 耐心看完,也许你会有所收获~ 概述 本文阅读时间:10-15分钟左右; 难度:初级,…...
c语言多功能计算软件170
定制魏:QTWZPW,获取更多源码等 目录 题目 要求 主要代码片段 题目 设计一个计算器软件,具备如下功能提示界面。 要求 设计出界面,注意界面名称最后为自己的姓名;(20分)能够实现加、减、乘、…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...
