当前位置: 首页 > 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;转载请附上原文出处链接及本声明…...

AI营销SaaS榜单评测:原圈科技如何助力品牌客户破局增长?

本文深度探讨AI营销行业趋势与SaaS产品评选标准。在众多解决方案中&#xff0c;原圈科技的AI营销SaaS平台凭借其领先的技术底层能力、产品成熟度及客户成功案例&#xff0c;在市场适配度与服务落地性等多个维度下表现突出&#xff0c;被普遍视为企业实现精细化营销升级的有力选…...

Kubernetes中的ConfigMap与Secret:安全高效管理配置的终极指南

引言&#xff1a;云原生时代的配置困境 在传统的运维模式中&#xff0c;配置往往硬编码在镜像中&#xff0c;或通过环境变量散落在各处。随着微服务架构的普及&#xff0c;这种模式带来了“配置漂移”、镜像臃肿、敏感信息泄露等痛点。 Kubernetes 通过 ConfigMap 和 Secret …...

告别‘千人千脑’:用DMMR模型搞定EEG情感识别的跨被试难题(附PyTorch代码)

突破脑电情感识别的个体差异壁垒&#xff1a;DMMR模型实战指南与PyTorch实现 当你在实验室里看着屏幕上跳动的脑电波形时&#xff0c;是否曾为不同受试者数据间的巨大差异而头疼&#xff1f;这种被称为"脑电指纹"的个体特异性&#xff0c;一直是情感识别领域最棘手的…...

Windows驱动存储深度管理:从问题诊断到系统优化的完整解决方案

Windows驱动存储深度管理&#xff1a;从问题诊断到系统优化的完整解决方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 问题发现&#xff1a;驱动管理中的隐形痛点与风险 系…...

新手零基础入门:通过快马生成burpsuite超详细安装图解教程

作为一名网络安全新手&#xff0c;第一次接触BurpSuite时确实容易被各种专业术语和复杂的安装步骤吓到。今天我就用最直白的方式&#xff0c;手把手带你完成BurpSuite的安装&#xff0c;让你轻松迈出Web安全测试的第一步。 什么是BurpSuite&#xff1f;为什么需要它&#xff1…...

Qwen3.5-9B-AWQ-4bit部署指南:双卡RTX 4090-D镜像免配置快速上手

Qwen3.5-9B-AWQ-4bit部署指南&#xff1a;双卡RTX 4090-D镜像免配置快速上手 1. 模型概述 千问3.5-9B-AWQ-4bit是一个支持图像理解的多模态模型&#xff0c;能够结合上传图片与文字提示词&#xff0c;输出中文分析结果。这个量化版本特别适合处理以下任务&#xff1a; 图片主…...

【深度剖析】从libgomp TLS内存分配冲突到scikit-learn在ARM平台的兼容性优化

1. ARM架构下TLS内存分配的底层原理 当你在ARM服务器上跑scikit-learn模型时&#xff0c;突然蹦出"cannot allocate memory in static TLS block"错误&#xff0c;这背后其实是线程本地存储&#xff08;TLS&#xff09;在作祟。想象每个线程都有自己专属的储物柜&…...

第一次降AIGC率不知道从哪入手?这份保姆级操作手册帮你

第一次操作的话&#xff0c;照着下面的步骤来&#xff0c;15分钟内搞定降AIGC率、降AI工具保姆级测评2026、降AI。 工具选嘎嘎降AI&#xff08;www.aigcleaner.com&#xff09;&#xff0c;达标率99.26%&#xff0c;有退款保障&#xff0c;操作也不复杂。 准备工作 需要准备的…...

如何用滑模控制(SMC)解决机器人轨迹跟踪中的抖动问题?5个实战技巧分享

如何用滑模控制&#xff08;SMC&#xff09;解决机器人轨迹跟踪中的抖动问题&#xff1f;5个实战技巧分享 当机械臂在执行高精度焊接任务时&#xff0c;末端执行器突然出现5Hz的高频震颤——这种场景对工业机器人工程师而言绝不陌生。滑模控制&#xff08;SMC&#xff09;因其强…...

Laya3D美术进阶:巧用Shader实现APP级游戏效果还原

1. 为什么选择Laya3D的Shader技术&#xff1f; 很多开发者第一次接触Laya3D时&#xff0c;都会有个疑问&#xff1a;为什么不用Unity直接开发&#xff1f;特别是在微信小游戏这个特定场景下&#xff0c;Laya3D的Shader技术到底能带来什么优势&#xff1f;我做了三年Laya小游戏…...