当前位置: 首页 > news >正文

设计模式——策略模式(Strategy Pattern)+ Spring相关源码

文章目录

  • 一、策略模式定义
  • 二、例子
    • 1. 菜鸟教程例子(略有改动)
      • 1.1 、定义。
      • 1.2、定义加法策略类
      • 1.3、定义乘法策略类
      • 1.4、创建 Context 类
      • 1.5、使用
    • 2、JDK awt包——BufferStrategy
    • 3、Spring源码 —— InstantiatorStrategy
    • 4、Spring源码 —— InstantiationStrategy
    • 5、SpringMVC源码—— AbstractMappingContentNegotiationStrategy
      • 策略实现类
  • 三、其他设计模式


一、策略模式定义

类型:行为型模式
目的:在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。


二、例子

1. 菜鸟教程例子(略有改动)

菜鸟的例子是加减乘除的例子。
将加减乘除分别封装成策略类。

1.1 、定义。

public interface Strategy {public int calc(int num1, int num2);
}

1.2、定义加法策略类

public class AddtionStrategy implements Strategy{@Overridepublic int calc(int num1, int num2) {return num1 + num2;}
}

1.3、定义乘法策略类

public class MultiplyStrategy implements Strategy{@Overridepublic int calc(int num1, int num2) {return num1 * num2;}
}

1.4、创建 Context 类

public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.calc(num1, num2);}
}

1.5、使用

public class StrategyPatternDemo {public static void main(String[] args) {Context context = new Context(new AddtionStrategy());    System.out.println("10 + 5 = " + context.executeStrategy(10, 5));}
}

2、JDK awt包——BufferStrategy

BufferStrategy类提供了一种在图形界面中进行双缓冲的方法。
策略实现类:

  • BltBufferStrategy
  • BltSubRegionBufferStrategy
  • FlipBufferStrategy
  • FlipSubRegionBufferStrategy
  • SingleBufferStrategy

3、Spring源码 —— InstantiatorStrategy

包:org.springframework.objenesis.strategy.InstantiatorStrategy

是一个创建实例的策略接口,它定义了一组规则和算法,用于选择实例化对象的方式。
InstantiatorStrategy 可以根据对象类型、构造函数参数等条件,利用反射机制或其他方式创建对象实例。
InstantiatorStrategy 通常作为工厂类的一部分,被用于创建不同类型的对象实例。

策略实现类:

  • StdInstantiatorStrategy :用于创建对象实例的一种策略类,通过反射来实现对象的创建,并提供了缓存机制来提高对象创建的效率。
  • SingleInstantiatorStrategy :实现创建单例 策略类。
  • SerializingInstantiatorStrategy :序列化创建实例 策略类。

4、Spring源码 —— InstantiationStrategy

包:org.springframework.beans.factory.support.InstantiationStrategy

InstantiationStrategy 是一个创建对象实例的默认策略,它定义了一个默认的实例化方式,可以根据一个 Class 对象创建对象实例。
InstantiationStrategy 常用于在反射调用时,通过默认的无参构造函数实例化一个对象,或者通过参数列表实例化一个对象。
在一些框架或工具中,InstantiationStrategy 可以被自定义或扩展,以满足不同的实例化需求。

策略实现类:

  • SimpleInstantiationStrategy : 简单创建实例。
  • CglibSubclassingInstantiationStrategy : 使用cglib创建实例。

5、SpringMVC源码—— AbstractMappingContentNegotiationStrategy

提供的一种用于 HTTP 内容协商的策略类。具体来说,它是 ContentNegotiationStrategy 接口的一个抽象实现,用于实现基于请求 URL 或文件扩展名的内容调解。
通过配置对于不同请求 URL 或文件扩展名所对应的媒体类型,AbstractMappingContentNegotiationStrategy 可以在处理 HTTP 请求时自动选择最合适的内容格式返回给客户端。

策略实现类

  • ParameterContentNegotiationStrategy
public class ParameterContentNegotiationStrategy extends AbstractMappingContentNegotiationStrategy {...}
  • PathExtensionContentNegotiationStrategy
@Deprecated
public class PathExtensionContentNegotiationStrategy extends AbstractMappingContentNegotiationStrategy {...}
  • ServletPathExtensionContentNegotiationStrategy
@Deprecated
public class ServletPathExtensionContentNegotiationStrategy extends PathExtensionContentNegotiationStrategy {...}

三、其他设计模式

创建型模式
结构型模式

  • 1、设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码

行为型模式

  • 1、设计模式——访问者模式(Visitor Pattern)+ Spring相关源码
  • 2、设计模式——中介者模式(Mediator Pattern)+ JDK相关源码

相关文章:

设计模式——策略模式(Strategy Pattern)+ Spring相关源码

文章目录 一、策略模式定义二、例子1. 菜鸟教程例子(略有改动)1.1 、定义。1.2、定义加法策略类1.3、定义乘法策略类1.4、创建 Context 类1.5、使用 2、JDK awt包——BufferStrategy3、Spring源码 —— InstantiatorStrategy4、Spring源码 —— Instanti…...

ORB-SLAM3算法2之开源数据集运行ORB-SLAM3生成轨迹并用evo工具评估轨迹

文章目录 0 引言1 数据和真值1.1 TUM1.2 EuRoc1.3 KITTI2 ORB-SLAM3的EuRoc示例3 ORB-SLAM3的TUM-VI示例4 ORB-SLAM3的ROS各版本示例4.1 单目4.2 单目和IMU4.3 双目4.4 双目和IMU4.5 RGB-D0 引言 ORB-SLAM3算法1 已成功编译安装ORB-SLAM3到本地,本篇目的是用TUM、EuRoc和KITT…...

Qt 序列化函数和反序列化函数

文章目录 界面学生类序列化函数反序列化函数刷新所选择的下拉表值添加 界面 学生类 // 创建学生信息类 class studentInfo { public:QString id; // 学号QString name; // 学生姓名QString age; // 学生年龄// 重写QDataStream& operator<<操作符&…...

Linux之线程池

线程池 线程池概念线程池的应用场景线程池实现原理单例模式下线程池实现STL、智能指针和线程安全其他常见的各种锁 线程池概念 线程池&#xff1a;一种线程使用模式。 线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待…...

MAC安装stable diffusion

./webui.sh --precision full --no-half-vae --disable-nan-check --api Command: "/Users/xxxx/aigc/stable-diffusion-webui/venv/bin/python3" -m pip install torch2.0.1 torchvision0.15.2 Error code: 2 执行命令&#xff1a; pip install torch2.0.1 torchvi…...

FPGA_状态机工作原理

FPGA_状态机介绍和工作原理 状态机工作原理Mealy 状态机模型Moore 状态机模型状态机描述方式代码格式 总结 状态机工作原理 状态机全称是有限状态机&#xff08;Finite State Machine、FSM&#xff09;&#xff0c;是表示有限个状态以及在这些状态之间的转移和动作等行为的数学…...

【python练习】python斐波那契数列超时问题

计算斐波那契数列第n项的数字 Description计算斐波那契数列第n项的数字&#xff0c;其中f(1)f(2)1,f(n)f(n-1)f(n-2)&#xff0c;如1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5,......Input 正整数n(n<100)Output 一个整数f(n)Sample Input 1 8 Sample Output 1…...

SpringCloud 微服务全栈体系(五)

第七章 Feign 远程调用 先来看我们以前利用 RestTemplate 发起远程调用的代码&#xff1a; 存在下面的问题&#xff1a; 代码可读性差&#xff0c;编程体验不统一 参数复杂 URL 难以维护 Feign 是一个声明式的 http 客户端&#xff0c;官方地址&#xff1a;https://github.…...

msvcp140.dll丢失的正确解决方法

在使用电脑中我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复丢失的msvcp140.dll文件。本文将介绍6个不同的解决方法&#xff0c;帮助读者解决…...

go pprof 如何使用 --chatGPT

gpt: pprof 是 Go 语言的性能分析工具&#xff0c;它可以用来检测 CPU 使用情况、内存使用情况、以及阻塞情况。你可以使用 pprof 来帮助诊断程序的性能问题&#xff0c;包括内存泄漏。 以下是如何使用 pprof 来分析内存泄漏的基本步骤&#xff1a; 1. **导入 pprof 包**&am…...

大数据可视化BI分析工具Apache Superset实现公网远程访问

大数据可视化BI分析工具Apache Superset实现公网远程访问 文章目录 大数据可视化BI分析工具Apache Superset实现公网远程访问前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网…...

软考系统架构师知识点集锦二:软件工程

一、考情分析 二、考点精讲 2.1 软件过程模型 &#xff08;1&#xff09;原型模型 典型的原型开发方法模型。适用于需求不明确的场景,可以帮助用户明确需求。可以分为[抛弃型原型]与[演化型原型] 原型模型两个阶段: 1、原型开发阶段;2、目标软件开发阶段。 &#x…...

Go并发:使用sync.Pool来性能优化

简介 在Go提供如何实现对象的缓存池功能&#xff1f;常用一种实现方式是&#xff1a;sync.Pool, 其旨在缓存已分配但未使用的项目以供以后重用&#xff0c;从而减轻垃圾收集器&#xff08;GC&#xff09;的压力。 快速使用 sync.Pool的结构也比较简单&#xff0c;常用的方法…...

git stash的使用方法

git stash的使用方法 应用场景 当我们在开发一个新功能的时候&#xff0c;或者开发到一半&#xff0c;然后就收到了线上master 出现了bug&#xff0c;当分支开发已经进行了或者进行到一半了&#xff0c;这时怎么办呢&#xff1f; 这时解决方案有两种&#xff1a;一种是先先将当…...

【影刀演示_发送邮件的格式化HTML留存】

发送邮件的格式化HTML留存 纯文本&#xff1a; 亲爱的小张: 端午节将至&#xff0c;公司为了感谢大家一年以来的辛勤工作和付出&#xff0c;特别为大家准备了京客隆超市福利卡&#xff0c;希望为大家带来些许便利和节日的喜悦。 以下是您的福利卡卡号和密码&#xff0c;请您…...

深度学习(4)---生成式对抗网络(GAN)

文章目录 一、原理讲述1.1 概念讲解1.2 生成模型和判别模型 二、训练过程2.1 训练原理2.2 损失函数 三、应用 一、原理讲述 1.1 概念讲解 1. 生成式对抗网络&#xff08;Generative Adversarial Network&#xff0c;GAN&#xff09;是一种深度学习模型&#xff0c;是近年来复杂…...

ThinkPad电脑HDMI接口失灵如何解决?

ThinkPad电脑HDMI接口失灵如何解决&#xff1f; 如果平时正常使用的外接显示器&#xff0c;某天突然无法使用了&#xff0c;重新插拔依然无信号的话&#xff0c;可以打开系统的设备管理器&#xff08;快捷键winx&#xff09;&#xff0c;首先看一下监视器的识别情况&#xff0c…...

第四部分:JavaScript

一&#xff1a;jQuery 1.1&#xff1a;jQuery介绍 什么是jQuery&#xff1f; jQuery是JavaScript和查询&#xff08;Query&#xff09;&#xff0c;它是辅助JavaScript开发的js类库 jQuery的核心思想 核心思想是write less&#xff0c;do more&#xff0c;所以它实现了很多浏览…...

【游戏开发】【心法】游戏设计心法系列1-以玩法为核心去设计游戏

游戏的本质 游戏的魔法在于寻找隐藏事物之间的联系。 游戏的魅力在于随着玩家逐渐发现并了解游戏世界的方方面面&#xff0c;他会得到一种丰富而深厚的体验。 挑战&#xff0c;竞争和互动是游戏玩法的三大要素。 规则&#xff0c;过程&#xff0c;目标则是游戏内容的要素。 如…...

chrome谷歌浏览器取消网页所有剪切板的授权方法步骤

地址栏输入 chrome://settings/content/clipboard选择 不允许网站查看您剪贴板中的文字或图片 ———————————————— 版权声明&#xff1a;本文为CSDN博主「一切V随缘」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明…...

目标检测算法改进系列之嵌入Deformable ConvNets v2 (DCNv2)

Deformable ConvNets v2 简介&#xff1a;由于构造卷积神经网络所用的模块中几何结构是固定的&#xff0c;其几何变换建模的能力本质上是有限的。在DCN v1中引入了两种新的模块来提高卷积神经网络对变换的建模能力&#xff0c;即可变形卷积 (deformable convolution) 和可变形…...

最新发布!阿里云卓越架构框架重磅升级

云布道师 10 月 19 日阿里云峰会山东上&#xff0c;阿里云重磅升级《阿里云卓越架构白皮书》&#xff0c;助力企业在阿里云上构建更加安全、高效、稳定的云架构。《阿里云卓越架构白皮书》在今年的阿里云峰会粤港澳大湾区首度亮相&#xff0c;这是阿里云基于多年服务各行各业客…...

如何监听/抓取两个设备/芯片之间“UART串口”通信数据--监视TXD和RXD

案例背景&#xff1a;全网仅此一篇&#xff01;&#xff01;&#xff01; 两个设备/芯片之间采用UART串口通信。我们如何实现芯片1 TXD – > 芯片2 RXD&#xff0c;芯片2 TXD --> 芯片1 RXD两个单线链路上的数据抓取和监听&#xff1f;这篇博客将告诉您。 目录 1 什么是…...

JDK项目分析的经验分享

基本类型的包装类(Character放在最后) String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer(补充正则表达式的知识) CharacterIterator、StringCharacterIterator、CharsetProvider、CharsetEncoder、CharsetDecoder(较难) java.util.function下的函数表…...

Java创建一个长度为10的数组,利用Arrays.sort(), 为数组元素排序

程序要求&#xff1a;1&#xff09;创建一个整型数组&#xff0c;数组的长度为10. 2&#xff09;给数组元素赋值&#xff0c;要求乱序。 3&#xff09;利用fori循环将数组元素依次输出。 4&#xff09;利用Arrays.sort(), 为数组元素排序 5&#xff09;采用增加for循环将排…...

python 动态加载C# 动态库的一些问题

python导入C#动态库问题 背景介绍 我使用的python是3.7&#xff0c;需要调用之前已经用于其他项目的C#编写的动态库(xx.dll).由于调用方法很简单&#xff0c;可以参考下这个调用动态库,这里主要说一下我遇到的问题。 试图加载格式不正确的程序 这个问题实际是由于目标程序和…...

代码审计-锐捷NBR路由器 EWEB网管系统 远程命令执行

那天下着很大的雨&#xff0c;母亲从城里走回来的时候&#xff0c;浑身就是一个泥人&#xff0c;那一刻我就知道我没有别的选择了 出现漏洞的文件在 /guest_auth/guestIsUp.php 审查源码我们发现通过命令拼接的方式构造命令执行 构造payload&#xff1a; /guest_auth/guestI…...

VBA技术资料MF75:测量所选单元格范围的高度和宽度

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…...

力扣 26. 删除有序数组中的重复项

目录 1.解题思路2.代码实现 1.解题思路 由于数组为非严格递增排列的数组&#xff0c;因此可利用快慢指针&#xff0c;如果快指针减一不等于快指针&#xff0c;将快指针的值给慢指针&#xff0c;并将快慢指针同时加一&#xff0c;但如果相同&#xff0c;则只让快指针加一向后走…...

【uniapp】仿微信支付界面

效果图 完整代码 <template><view class="my-pay-page"><view :style=...