Java23种设计模式-行为型模式之策略模式

策略模式(Strategy Pattern):将算法的使用从算法的实现中分离出来,从而让算法的变化不会影响到使用算法的用户

通常涉及三个角色
1.上下文(Context):持有策略接口的引用,并在运行时根据需要更换具体的策略实现
2.策略接口(Strategy):定义了所有可能的算法实现应该遵循的协议
3.具体策略实现(Concrete Strategy):实现则实现了这些协议,并为特定的算法提供具体的实现

优点
1.算法的变化不会影响到客户端。
2.可以轻松地切换不同的算法。
3.可以动态地选择不同的算法。

缺点
1.客户端必须知道所有的策略类,至少是它们的接口。
2.可能会增加系统中的类的数量。

应用场景
当一个系统需要多种算法变体时。
当这些算法相互之间是等价的,且可以互换时。
当算法可能发生变化,且变化不应影响到使用算法的客户端时。

示例:FlyStrategy 是策略接口,FlyWithWings 和 FlyNoWay 是具体策略类,Duck 是上下文类,客户端通过创建不同策略的 Duck 对象来模拟不同鸭子的飞行行为

//策略接口
public interface FlyStrategy {void fly();
}
//具体策略类
public class FlyWithWings implements FlyStrategy{@Overridepublic void fly() {System.out.println("The duck is flying with its wings.");}
}
// 具体策略类
public class FlyNoWay implements FlyStrategy{@Overridepublic void fly() {System.out.println("The duck cannot fly");}
}
//上下文
public class Duck {private FlyStrategy flyStrategy;public Duck(FlyStrategy flyStrategy) {this.flyStrategy = flyStrategy;}public void performFly(){flyStrategy.fly();}
}
//客户端
public class Client {public static void main(String[] args) {Duck mallardDuck=new Duck(new FlyWithWings());mallardDuck.performFly();Duck rubberDuck=new Duck(new FlyNoWay());rubberDuck.performFly();}
}

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

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

相关文章

EigenLayer生态全解析:再质押与AVS崛起的序章

基于以太坊网络的再质押协议EigenLayer提出了利用为以太坊网络验证而质押的ETH来与其他协议共享安全性和资本效率,同时为协议参与者提供额外利息。在AVS、再质押、积分系统等概念的推动下,逐渐形成一个庞大的生态系统,从2024年初到现在EigenL…

Linux内核驱动开发-001字符设备开发-内核中断驱动独立按键

1驱动程序 /*************************************************************************> File Name: key_enit.c> Author: yas> Mail: rage_yashotmail.com> Created Time: 2024年04月22日 星期一 20时20分42秒**********************************************…

使用JS代理 实现大对象的功能拆解

序言 在Android开发中,可以通过webView的addJavascriptInterface方法注入一个对象到网页中。但是随着开发的需求越来越多。这个对象身上的方法也越来越多。这个对象对应的java类,体积越来越大,不利于维护。为了在不影响之前代码的基础上。把…

【C++干货基地】深度理解C++中的高效内存管理方式 new delete

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

Golang基础5-指针、结构体、方法、接口

指针 和c/c类似,但是go语言中指针不能进行偏移和运算,安全指针 &(取地址) *(根据地址取值) nil(空指针) make和new之前对比:make用于初始化slice,map,channel这样的引用类型 而new用于类…

Metasploit Framework(MSF)从入门到实战(一)

MSF的简介 目前最流行、最强大、最具扩展性的渗透测试平台软件 基于Metasploit进行渗透测试和漏洞分析的流程和方法 2003年由HD More发布第一版,2007年用ruby语言重写 架集成了渗透测试标准 (PETS) 思想 一定程度上统一了渗透测试和漏洞研究的工作环…

针孔相机模型原理坐标系辨析内参标定流程内参变换

针孔相机的内参标定 针孔相机原理真空相机模型图片的伸缩和裁剪变换 内参标定———非线性优化张正定标定详细原理(含公式推导)通过多张棋盘格照片完成相机的内参标定流程(C代码)其他工具箱 相机分为短焦镜头和长焦镜头,短焦镜头看到的视野更广阔,同样距…

Debian常用命令

Debian是一种常见的Linux发行版,以下是一些常用的Debian命令: 1. apt-get:用于安装、升级和删除软件包。例如:apt-get install package_name。 2. dpkg:用于管理Debian软件包。例如:dpkg -i package_name…

白平衡简介

文章目录 白平衡的概念白平衡的调节常见的白平衡模式 白平衡的概念 白平衡是指摄影、摄像和显示技术中的一项重要概念,用于调节图像中的白色或中性灰色的色彩,使其看起来在不同光源条件下都是准确的白色或灰色。白平衡的主要目的是确保图像的色彩准确性…

C语言 | Leetcode C语言题解之第49题字母异位词分组

题目: 题解: /*1.将字符串原串与副本进行绑定成一个节点2.对字符串副本进行按ascii码表进行从小到大排序3.按照字符串进行比较排序4.合并 */ typedef struct Node{char*s;char*s_vice;int len; }Node;void sortShellChar(char*s,int len){for(int dista…

TS类型断言

类型断言(Type Assertions)在 TypeScript 中确实是一种在表达式级别上临时指定类型的机制,它允许开发者在编译时覆盖编译器的类型推断结果。类型断言有两种语法形式: “尖括号”语法: let someValue: any this is a s…

查找总价格为目标值的两个商品 ---- 双指针

题目链接 题目: 分析: 解法一: 暴力解法, 将每两个的和都算出来, 判断是否为目标值解法二: 数组中的数是按升序排序的, 我们可以定义左右指针 如果和小于目标值, 则应该让和变大, 所以左指针右移如果和大于目标值, 则应该让和变小, 所以右指针左移 思路: 定义left 0, righ…

python学习29:python中的字典dict

python中的字典dict 1.字典的定义: 同样是使用{},不过存储的元素是一个个的:键值对,如下语法: """ 字典的定义: #定义字典字面量:{key:value,key:value,....,key:value} #定义字典变量&am…

每天一个数据分析题(二百九十)——直方图与条形图

关于直方图与条形图的描述,下列说法正确的是() A. 直方图用于展示分类型数据的分布情况 B. 直方图用来展示数值型数据的分布情况 C. 条形图只能用于展示顺序型数据的分布情况 D. 条形图只能用于展示分类型数据的分布情况 题目来源于CDA模…

绝地求生【商城更新】WIA联名上架//专属商店下架

大家好,我是闲游盒. 本周商城将在4.24(周三)更新,商城内容更新如下: 上架物品 ▲W.I.A联名皮肤大礼包 小礼包如下: 包含3套衣服以及MINI、DBS的联名皮肤,3个头饰还挺有特色的,你喜欢…

链栈算法库构建

学习贺利坚老师, 链栈 , 构建链栈算法库 数据结构之自建算法库——链栈_领会链栈结构和掌握链栈中的各种基本算法-CSDN博客文章浏览阅读3.9k次,点赞3次,收藏8次。本文针对数据结构基础系列网络课程(3):栈和队列中第4课时栈的链式存储结构及其…

安全开发实战(3)--存活探测与端口扫描

目录 安全开发专栏 前言 存活探测 端口扫描 方式一: 1.3.1 One 1.3.2 Two 1.3.3 批量监测 方式二: 1.3.1 One 1.3.2 Two 1.3.3 Three 1.3.4 扫描ip地址,提取出开放端口和协议 ​编辑 1.3.5 批量扫描(最终完成版) 总结 安全开发专栏 安全开发实战​http://t.csd…

数据安全风险评估流程

数据安全风险评估是一个系统性的过程,旨在识别、评估和管理数据安全风险。以下是数据安全风险评估的一般流程及其内容: 确定评估范围:确定评估的范围和目标,包括评估的数据资产、系统、流程和相关方。 收集信息:收集有…

spring mvc \ spring boot \ spring cloud

spring mvc 主要是用作IOC 容器 框架还是传统三层架构 1.容器 依赖注入 CDI 传统web是由beanmanager管理bean的依赖和注入,beanfactory管理bean的创建,以消息进行驱动(HttpSessionListener等) 由框架自行管理 2.IOC 控制反转 bean的创建由开发人员…

leveldb中THREAD_ANNOTATION_ATTRIBUTE__宏的作用

THREAD_ANNOTATION_ATTRIBUTE__ 宏在 LevelDB 或类似的 C 项目中用于指定线程安全相关的源码注解(Source Code Annotation),这些注解有助于清晰地表达程序中函数、变量、类型等元素在多线程环境中的行为特征和并发保证。这样的注解不仅有助于…