设计模式之策略模式

news2024/11/24 14:39:50

Strategy design pattern

策略模式的概念、策略模式的结构、策略模式的优缺点、策略模式的使用场景、策略模式的实现示例、策略模式的源码分析


1、策略模式的概念

  策略模式,即定义一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的用户。策略模式属于对象行为模式,它通过对算法进行封装,使把使用算法的责任和算法的实现分离开来,并委托给不同的对象对这些算法进行管理。

2、策略模式的结构

  • 抽象策略角色:定义算法的行为,通常是接口或抽象类。
  • 具体策略角色:实现抽象策略,实现其定义的算法行为。
  • 上下文类:持有一个策略的引用,以委托的方式调用策略中算法的行为,并将其暴露给外部。

strategy-class

3、策略模式的优缺点

  • 优点:
    • 算法(策略)可以自由切换。
    • 避免使用 if else 等多重条件判断。
    • 扩展性良好。
  • 缺点:
    • 当策略过多时会导致系统类爆炸。
    • 所有策略类都需对外暴露。

4、策略模式的使用场景

  • 当系统需要动态的在几种算法中选择一种时,可将每个算法封装到策略类中。
  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支用策略类代替。
  • 系统中算法彼此完全独立,且要求对用户隐藏算法的具体实现细节时。
  • 多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择要执行的行为。

5、策略模式的实现示例

抽象策略类:

public interface Equipment {

    /**
     * 定义算法
     */
    void equipment();
}

具体策略一:

public class OneEquipment implements Equipment {

    @Override
    public void equipment() {
        System.out.println("明朗之靴 德拉克撒的慕刃 赛瑞尔达的怨恨 幽梦之灵 夜之锋刃 守护天使");
    }
}

具体策略二:

public class TwoEquipment implements Equipment {

    @Override
    public void equipment() {
        System.out.println("水银之靴 星蚀 贪欲九头蛇 死亡之舞 玛莫提乌斯之噬 黑色切割着");
    }
}

上下文:

public class Context {

    private Equipment equipment;

    public Context(Equipment equipment) {
        this.equipment = equipment;
    }

    public void setEquipment(Equipment equipment) {
        this.equipment = equipment;
    }

    public void equipment() {
        this.equipment.equipment();
    }
}

测试:

public class StrategyTest {

    public static void main(String[] args) {
        Context client = new Context(new OneEquipment());
        client.equipment();

        client.setEquipment(new TwoEquipment());
        client.equipment();
    }
}

测试结果:

明朗之靴 德拉克撒的慕刃 赛瑞尔达的怨恨 幽梦之灵 夜之锋刃 守护天使
水银之靴 星蚀 贪欲九头蛇 死亡之舞 玛莫提乌斯之噬 黑色切割着

6、策略模式的源码分析

  spring security 中的 SecurityContextRepository 类的设计就用到了策略模式。其定义了操作 SecurityContext 的各种方法,然后交由子实现类去实现具体的操作细节。这是典型的策略模式的应用,同样,SessionRegistory 也用到了策略模式。

public interface SecurityContextRepository {
	@Deprecated
	SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder);

	default Supplier<SecurityContext> loadContext(HttpServletRequest request) {
		return () -> loadContext(new HttpRequestResponseHolder(request, null));
	}

	void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response);

	boolean containsContext(HttpServletRequest request);
}

  其子实现类 HttpSessionSecurityContextRepository、NullSecurityContextRepository、RequestAttributeSecurityContextRepository 等都是具体的策略类,当然我们也可以自定义策略类,如在实现分布式权限认证时。

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

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

相关文章

Android平台GB28181接入模块技术接入说明

技术背景 今天&#xff0c;我们主要讲讲Android平台GB28181接入模块的技术对接&#xff0c;Android平台GB28181接入模块设计的目的&#xff0c;可实现不具备国标音视频能力的 Android终端&#xff0c;通过平台注册接入到现有的GB/T28181—2016服务&#xff0c;可用于如智能监控…

【Mitigating Voltage Attacks in Multi-Tenant FPGAs 论文笔记】

减轻多租户FPGA中的电压攻击摘要引言内容背景和相关工作INTEL STRATIX 10 FPGA上的PDN攻击Stratix 10 PDN特性定位电压下降片上监控和攻击抑制结论和未来工作结论&#xff1a;未来工作作者&#xff1a;GEORGE PROVELENGIOS, University of Massachusetts Amherst, MA, USADANIE…

Python学习-9.2 程序界面-sys库介绍

可以在Python标准库大全&#xff1a;https://docs.python.org/zh-cn/3/library/index.html中查找sys标准库的解释说明 sys标准库 本章对sys标准库中的重点函数进行讲解&#xff0c;sys库的作用主要是查看python解释器信息及传递信息给python解释器。 sys库的三个重要函数&…

JVM-------栈

栈&#xff1a; 早在数据结构的学习中&#xff0c;我们就知道了栈具有先进先出的特点&#xff0c;而数据结构是程序的一部分&#xff0c;那么栈的特点在java中是如何体现的呢? 比如&#xff1a;main函数先执行而后结束&#xff0c;就是利用了栈的特点。 在java中&#xff0c…

[附源码]计算机毕业设计Node.jsBuff饰品交易平台论文(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

2022需求最大的8种编程语言排名

DevJobsScanner分析了过去14个月&#xff08;从2021 10月到2022年11月&#xff09;超过1200万开发人员的工作需求&#xff0c;并选择了明确需要编程语言的工作机会&#xff0c;获得了2022年最流行的八种编程语言。 市场上需求最高的前八种语言是&#xff1a; 1、 JavaScript/…

Appium基础 — Appium Inspector定位工具(二)

5、Appium Inspector工具的使用 &#xff08;1&#xff09;Inspector 定位控件界面的详细介绍 布局1&#xff1a;截图的手机界面 可以点击选择元素。 布局2&#xff1a;顶部操作栏 从左往右的按钮依次是 Select Element&#xff1a;选择元素。 Swipe By Coordinates&#xff…

json-server

安装node.js https://nodejs.org/zh-cn/download/剩下内容就是next&#xff0c;就默认安装在C盘好了。 WindowR:node -v 下面这种结果代表安装成功 还有 npm -v NPM 是什么 NPM描述 npm&#xff08;“Node 包管理器”&#xff09;是 JavaScript 运行时 Node.js 的默认程序包…

redis之数据倾斜如何处理

写在前面 我们在使用Redis分片集群时&#xff0c;集群最好的状态就是每个实例可以处理相同或相近比例的请求&#xff0c;但如果不是这样&#xff0c;则会出现某些实例压力特别大&#xff0c;而某些实例特别空闲的情况发生&#xff0c;本文就一起来看下这种情况是如何发生的以及…

基于Ubuntu + anaconda + tensorflow+jupyter的python深度学习开发环境配置

参考 基于Ubuntu anaconda tensorflowjupyter的python深度学习开发环境配置 - 云社区 - 腾讯云 1.激活Anaconda环境 下载anaconda并拷贝到安装目录中并解压&#xff0c;下载地址为&#xff1a; https://repo.anaconda.com/archive/Anaconda2-5.3.0-Linux-x86_64.sh 跳转…

如何在UnrealEngine虚幻引擎中加载Web页面

对于非游戏开发团队来讲&#xff0c;在面向非游戏领域的UE项目中嵌入Web页面并实现交互无疑能充分利用现有开发资源和流程&#xff0c;WebUI插件能提供完整的Web页面加载及交互手段&#xff0c;让团队中的UE开发工程师和Web开发工程师能够各司其职、紧密配合。 WebUI的安装配置…

互联网医疗领域月度观察——二十大报告明确提出健康中国建设目标,互联网医疗是建设重点

易观分析&#xff1a;在二十大报告中明确提及“把保障人民健康放在优先发展的战略位置&#xff0c;完善人民健康促进政策”“促进优质医疗资源扩容和区域均衡布局&#xff0c;坚持预防为主&#xff0c;加强重大慢性病健康管理&#xff0c;提高基层防病治病和健康管理能力”等有…

FLET简介:用Python构建Flutter应用

你知道可以用 Python 来构建 flutter 应用吗&#xff1f;&#x1f62e; Flutter 在软件研发领域是非常流行的&#xff0c;今年就让我们深入了解一下&#xff0c;用 Python 构建 flutter 应用程序的世界&#xff01;&#x1f642; 关于 FLET 梦想橡皮擦 在开始学习前&#xf…

【图像重建】正则化图像超分辨重建【含Matlab源码 1882期】

⛄一、正则化图像超分辨重建简介 图像超分辨率重建的非局部正则化模型与算法研究 利用图像非局部不连续性测度的概念,建立了面向图像超分辨的非局部正则化能量泛函和相应的变分框架.理论分析了该框架与目前关于双边滤波等一类广义邻域滤波器和经典的变分偏微分方程模型之间的…

[附源码]Nodejs计算机毕业设计焦作旅游网站Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

力扣(LeetCode)168. Excel表列名称(C++)

26进制 本题的数字从 111 开始&#xff0c;即 A1A1A1&#xff0c;Z26Z26Z26 。进制转化是依次提取数字从低到高的每一位&#xff0c;要求每一位从 000 开始 。对当前数字 −1-1−1 &#xff0c;等于进制最低位 −1-1−1 &#xff0c;也就是最低位看作 A0A0A0&#xff0c;Z25Z2…

Docker:Nacos的持久化和集群部署

目录 一、MySQL容器构建 二、单节点nacos容器外网部署 三、内网nacos多节点集群部署 四、外网Nginx负载内网nacos节点集群 一、MySQL容器构建 由于我们今天要启动的服务比较多&#xff0c;考虑到部分电脑可能会出现带不动的情况&#xff0c;我们可以先将之前的文件备份一下…

【教程】Anaconda安装

零、Anaconda介绍 Anaconda个人版是一个免费、易于安装的包管理器、环境管理器和Python发行版&#xff08;所以装了Anaconda就可以不用再另外装Python了&#xff09;&#xff0c;有提供非常多的开源包&#xff0c;用Anaconda来安装这些开源包相对来说方便一些&#xff0c;Anac…

jdk下载与安装教程(win10)

JAVA下载地址&#xff1a;Java Downloads 下载后直接点击安装程序&#xff0c;点击【运行】。 安装过程很简单&#xff0c;一直点击下一步就可以了。 安装完成后配置&#xff1a; 一、右键点击桌面【此电脑】&#xff0c;选择【属性】。 二、选择【高级系统设置】。 三、点击…

Git学习笔记-1.Git基础知识

Git 食用方法 1.简介 Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 相信很多同学抄作业写作业的时候多多少少都见过git clone xxx这样的命令&#xff0c;这也算与Git结识的一个奇怪方式&#xff1f; 值得一提的是&#xff0c;Gi…