23种设计模式之策略模式(Strategy Pattern)

news2024/11/28 17:45:59

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的策略模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始
在这里插入图片描述

文章目录

  • 策略模式概念
  • 策略模式角色
  • 策略模式优缺点
  • 策略模式代码案例
  • 策略模式小结

策略模式概念

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时动态改变对象的行为。策略模式优先考虑将算法、业务规则等抽象成不同的类,从而可以通过组合实现各种功能和应用场景。

策略模式角色

策略模式通常包括以下几个角色:

策略接口(Strategy Interface):定义了所有具体策略类都需要实现的方法或者属性等,包括上下文可以调用的所有操作。

具体策略类(Concrete Strategy Class):实现了策略接口中定义的所有方法,并且封装了一个特定的算法、业务规则等。

上下文类(Context Class):包含着与具体策略类相关联的数据,并控制着具体策略类的初始化、调用、切换等操作。

在使用策略模式时,我们通常将具体策略类定义为独立的类或者匿名内部类,以便于后期对其进行扩展和维护。同时,我们还可以提供一些工厂模式和单例模式等去创建和管理具体策略类,并使用IOC容器来统一管理上下文类和具体策略类的生命周期等。

策略模式优缺点

策略模式的优点包括:

  1. 可以动态切换具体策略类,不需要修改上下文类的代码,提高了代码的灵活性和可维护性。

  2. 可以避免使用复杂的条件语句或者多层嵌套等,提高了代码的可读性和易用性。

  3. 可以使算法、业务规则等更加独立和可测试,从而降低了耦合性和复杂度。

策略模式的缺点包括:

  1. 需要定义和管理大量的具体策略类,增加了代码量和维护难度。

  2. 如果策略接口较为复杂或者需要频繁调整,可能会导致系统性能下降。

策略模式代码案例

我们使用一个简单的例子来介绍下策略模式:

首先,我们需要定义一个策略接口(Strategy Interface),其中包含了所有具体策略类都需要实现的方法:

public interface Strategy {
    int calculate(int a, int b);
}

然后,我们可以定义几个具体策略类(Concrete Strategy Class),它们分别对应不同的算法、业务规则等:

public class AddStrategy implements Strategy {
    @Override
    public int calculate(int a, int b) {
        return a + b;
    }
}

public class SubtractStrategy implements Strategy {
    @Override
    public int calculate(int a, int b) {
        return a - b;
    }
}

public class MultiplyStrategy implements Strategy {
    @Override
    public int calculate(int a, int b) {
        return a * b;
    }
}

接下来,我们需要定义一个上下文类(Context Class),它通过组合具体策略类实现不同的功能:

public class Context {
    private Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int a, int b) {
        return strategy.calculate(a, b);
    }
}

最后,我们可以通过如下方式使用策略模式:

public class Main {
    public static void main(String[] args) {
        int a = 10;
        int b = 5;

        Context context = new Context();

        Strategy addStrategy = new AddStrategy();
        context.setStrategy(addStrategy);
        int result1 = context.executeStrategy(a, b);
        System.out.println(a + " + " + b + " = " + result1);

        Strategy subtractStrategy = new SubtractStrategy();
        context.setStrategy(subtractStrategy);
        int result2 = context.executeStrategy(a, b);
        System.out.println(a + " - " + b + " = " + result2);

        Strategy multiplyStrategy = new MultiplyStrategy();
        context.setStrategy(multiplyStrategy);
        int result3 = context.executeStrategy(a, b);
        System.out.println(a + " * " + b + " = " + result3);
    }
}

运行我们的代码,输出结果如下:

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

在上面的例子中,我们通过策略模式实现了对不同算法的封装和组合,从而实现了更灵活、易维护的代码设计。

策略模式小结

总之,策略模式通常适用于将相似但不同的算法、业务规则等进行封装和组合的应用场景,它通过分离算法、封装变化、抽象依赖等方式,实现了代码的扩展性和重用性。

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

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

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

相关文章

构建Transformer模型 | 在wikiText-2数据集上训练一个语言模型

0 Introduction CSDN上有很多关于Transformer模型代码及解析的教程,但总体感觉还是不够直观,本文来自以B站上一个公开课,讲得非常详细,建议花一点时间从头到尾跟做一遍,单纯看静态的代码和文字描述,还是比…

十大排序(四)

上几篇文章我们说的是比较类的排序,今天给大家分享一下非比较累的排序;非比较类中包含桶排序 :基数排序、桶排序、计数排序 计数排序 找出待排序的数组中最大和最小的元素; 统计数组中每个值为i的元素出现的次数,存入…

Azure Active Directory 的功能和优势

Azure Active Directory (Azure AD) 是 Microsoft 基于云的多租户目录和标识管理服务。 Azure AD 有助于支持用户访问资源和应用程序,例如: 位于企业网络上的内部资源和应用。 Microsoft 365、Azure 门户和 SaaS 应用程序等外部资源。 为组织开发的云应…

详解uni-app应用生命周期函数

详解uni-app应用生命周期函数 详解uni-app应用生命周期函数 文章目录 详解uni-app应用生命周期函数前言一、应用生命周期函数二、页面生命周期函数总结 前言 UNI-APP学习系列之详解uni-app应用生命周期函数 一、应用生命周期函数 函数名说明onLaunch当uni-app 初始化完成时触…

web自动化测试流程的总结及关注点

目录 一、立项后测试需要拿到的文档 二、需求评审 三、用例编写(同时根据开发计划编写测试计划) 四、用例评审 五、测试执行 六、测试报告及操作手册 项目的测试流程大只包含的几个阶段:立项、需求评审、用例评审、测试执行、测试报告文…

【PXIE301-204】基于PXIE 总线的4 路Cameralink Base 图像采集卡

产品概述: PXIE301‐204 一款基于3U PXI Express 总线的高性能4 路CameraLink Base 图像采集卡,该板卡采用Xilinx 的高性能Kintex‐7 系列FPGA 作为主控制器,实现PCI Express 总线接口的转换,图像数据的缓存,以及Camer…

MySQL表数据的CRUD操作

文章目录 一、CRUD二、Create1.插入基本语法2.单行数据全列插入3.多行数据指定列插入4.插入时如果冲突则更新旧值5.插入时如果冲突则替换 三、Retrieve1.查找基本语法2.全列查询2.指定列查询3.查询字段为表达式4.为查询结果指定别名5.查询结果去重6.where条件7.结果排序8.将查找…

石头剪刀步微信小程序游戏

石头剪刀步微信小程序游戏 一、概述二、选题内容三、效果四、前端源码五、后端源码 一、概述 之前接了学弟的一个课程作业,但是因为某些原因,最终换成了一个新的爬虫项目。 这个作业就是一个石头剪刀步的微信小游戏。就是与系统随机的单机PK&#xff0…

【手撕Spring源码】容器与Bean

文章目录 容器接口容器实现BeanFactory容器实现ApplicationContext容器实现 Bean的生命周期模板方法设计模式Bean后处理器BeanFactory 后处理器有关后处理器(PostProcessor)的调用时期Aware 接口 和 InitializingBean 接口初始化和销毁Scope 容器接口 此节我们要: 了…

人机交互学习-1 人机交互概述

人机交互概述 背景知识人机交互研究的内容人机交互的重要性用户体验用户体验的特性最佳用户体验 人机交互的发展历史人机交互与软件工程人机交互与软件工程的学科差异人机交互与软件工程的不同观点软件工程在交互式系统的缺陷人机交互对软件工程的处理人机交互与软件工程的融合…

2023年春秋杯网络安全联赛春季赛Reverse题目复现

文章目录 一.sum1. 分析程序逻辑2.解数独矩阵3.解题脚本 二.Poisoned_tea_CHELL1. 重新识别函数及程序逻辑分析2.IDA动态调试(attach附加调试)3. 输入选项进行单步调试4.解题脚本 一.sum 1. 分析程序逻辑 这里直接贴上当时分析的结果,根据程序行为不难猜出是数独问题(还得靠猜…

六轴机械臂正逆解计算

一、机械臂运动学 机械臂运动学就是根据未端执行器与所选参考坐标系之间的几何关系,确定末端执行器的空间位置和姿态与各关节变量之间的数学关系。包括正运动学 (Forward Kinematics)和逆运动学 (InverseKinematics)两部分。 正运动学就是根据给定的机器人的各个关…

关于Vuex中使用mapGetters的应用以及项目实例演示以及gettes从接口获取内容更新

哈喽,小伙伴们大家好啊 今天在项目中看到了Vuex,以及看到了mapGettes的使用 1.首先第一步 在src->store->index.js文件中 import Vue from vue import Vuex from vuex import getters from ./gettersVue.use(Vuex) 2.然后第二步骤 在getters文…

[java]关于会话Session

前言: 客户端向服务端发请求,登陆完之后,进入到首页,如何让客户端知道它有没有登陆过呢,需要从首页里面向服务器发出异步请求,请求当前登录的用户信息,登录过就能获取得到,没登陆过获取不到。 …

Socket安全(二)

文章目录 1. 客户端模式2. 创建安全服务器Socket3. 配置SSLServerSocket 1. 客户端模式 大多数安全通信中,服务器需要使用适当的证书认证自己。不过客户端不需要(淘宝需要向用户证明它确实是淘宝,但我不需要向淘宝证明我自己的身份&#xff…

Skywalking9.4.0部署监控项目

1、SkyWalking简介 SkyWalking是国内开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前使用厂商最多,版本更新较快,已成为 Apache 基金会顶级项目。 它有哪些功能呢…

WebGPU你让我等的好辛苦啊

什么是WebGPU WebGPU是一种新兴的Web标准,旨在为Web应用程序提供高性能的图形和计算功能。它是一种低级别的图形API,为开发人员提供了对现代GPU的直接访问,以实现更高效的图形渲染和通用计算。 WebGPU的设计目标是提供与现代图形API&#x…

文心一言 VS 讯飞星火 VS chatgpt (26)-- 算法导论5.1 1题

一、证明:假设在过程 HIRE-ASSISTANT 的第 4 行中,我们总能决定哪一个应聘者最佳。则意味着我们知道应聘者排名的全部次序。 文心一言: 证明: 假设在过程 HIRE-ASSISTANT 的第 4 行中,我们总能决定哪一个应聘者最佳。则意味着我们知道应聘…

png图片压缩后黑底问题解决

问题背景 使用thumbnail对图片进行压缩,偶然会发现对png图片出现黑底的情况如下: 压缩前 压缩后 问题解决 对网上搜到的解决方法主要有两种: 1.指定png输出 JAVA - Get black background when uploading PNG image - Stack Overflow 一…

大数据好找工作么?前景如何

大数据好不好找工作不是一概而论的,要根据你个人的学历情况,掌握技能程度,所在城市招聘需求,甚至是你的面试能力和简历是否突出优势有关。 但是毋庸置疑的是,大数据目前的发展前景还是相当优秀的。 我们知道&#xf…