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

news/2024/10/18 14:13:28/

策略模式(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.ppmy.cn/news/1438441.html

相关文章

个人音乐播放网站项目(SpringBoot+Linux部署上线)

在做完第一个博客系统项目以后,接着做下一个项目:音乐播放网站项目,此项目应用的技术栈和第一个项目是差不多的,即算是学完SSM等知识以后的两个入门级Java开发项目吧。 此项目包含的核心功能有: 一、登录、注册、退出…

某赛通电子文档安全管理系统 多处 SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

oracle--merge into :匹配则更新不匹配则插入

merge into :匹配则更新不匹配则插入 --语法 merge into 目标表 using (增量) on (匹配字段) where matched then update set --update和sel直接不需要加表名 when not matched then insert values--insert和values之间不需要加i…

C++感受6-Hello World 交互版

变量、常量输入、输出、流getline() 函数读入整行输入Hello() 函数复习新定义函数 Input() 实现友好的人机交互还有 “痘痘” 为什么挤不到的分析…… 1. DRY 原则简介 上一节课,我们写了两版“问候”程序。第一版的最大问题是重复的内容比较多,每一次问…

【微软押注ARM架构,“Wintel”联盟摇摇欲坠?】

2024年,对于PC产业而言也许将会是转折性的一年。得益于ARM芯片的入局以及ChatGPT所带来的人工智能风潮,新一代移动架构的笔记本和应用人工智能技术的「AI PC」已经走上舞台。 本文引用地址:http://www.eepw.com.cn/article/202404/457786.ht…

防盗链在nginx中如何配置,简单演示403forbidden的效果

一、使用场景: 资源被其他网站无端盗用 服务器压力无端增加 二、实现方法 1.valid_referers指令可以检测被访问资源从哪个地址来 2.通过referer头字段判断 3.若为空,报403错误 nginx的准备工作: 可以看 虚拟机中使用LNMP模拟跨域并结合…

Reactjs数据篇

参考代码:GitHub - leellun/zhiqu-web-test2 1 通过createAction创建Action做数据传递 在 Redux 中定义动作的常用方法是分别声明一个动作类型常量和一个动作创建器函数来构造该类型的动作。 store/action.ts import { createAction } from "reduxjs/toolk…

架构师系列- 定时任务(四)- XXl-Job

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展,其中“XXL”是主要作者,大众点评许雪里名字的缩写 和ElasticJob的区别 相同点 E-Job和X-job都有普遍的用户基础和完整的技术文档,都…