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

文章目录

  • 一、策略模式定义
  • 二、例子
    • [1. 菜鸟教程例子(略有改动)](#1. 菜鸟教程例子(略有改动))
    • [2、JDK awt包------BufferStrategy](#2、JDK awt包——BufferStrategy)
    • [3、Spring源码 ------ InstantiatorStrategy](#3、Spring源码 —— InstantiatorStrategy)
    • [4、Spring源码 ------ InstantiationStrategy](#4、Spring源码 —— InstantiationStrategy)
    • [5、SpringMVC源码------ AbstractMappingContentNegotiationStrategy](#5、SpringMVC源码—— AbstractMappingContentNegotiationStrategy)
  • 三、其他设计模式

一、策略模式定义

类型:行为型模式

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


二、例子

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

菜鸟的例子是加减乘除的例子。

将加减乘除分别封装成策略类。

1.1 、定义。

java 复制代码
public interface Strategy {
   public int calc(int num1, int num2);
}

1.2、定义加法策略类

java 复制代码
public class AddtionStrategy implements Strategy{
   @Override
   public int calc(int num1, int num2) {
      return num1 + num2;
   }
}

1.3、定义乘法策略类

java 复制代码
public class MultiplyStrategy implements Strategy{
   @Override
   public int calc(int num1, int num2) {
      return num1 * num2;
   }
}

1.4、创建 Context 类

java 复制代码
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、使用

java 复制代码
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
java 复制代码
public class ParameterContentNegotiationStrategy extends AbstractMappingContentNegotiationStrategy {...}
  • PathExtensionContentNegotiationStrategy
java 复制代码
@Deprecated
public class PathExtensionContentNegotiationStrategy extends AbstractMappingContentNegotiationStrategy {...}
  • ServletPathExtensionContentNegotiationStrategy
java 复制代码
@Deprecated
public class ServletPathExtensionContentNegotiationStrategy extends PathExtensionContentNegotiationStrategy {...}

三、其他设计模式

创建型模式
结构型模式

行为型模式

相关推荐
Bingo_BIG2 天前
Java Spring框架:单表的查询、新增、修改、删除、导入、导出
java·spring·前后端
paopaokaka_luck2 天前
智慧社区综合服务小程序(人脸识别、AI问答、Echarts图形化分析)
前端·javascript·spring boot·spring·数据分析·echarts
牧瀬クリスだ2 天前
YAML配置详解:SpringBoot实战指南
java·spring·yml
需要8262 天前
JVM 内存区域与对象创建:一次 GC 从哪来
java·jvm·spring boot·spring·servlet·tomcat
Zane19942 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
paopaokaka_luck2 天前
考研政治刷题小程序(AI推荐题目、ECharts数据分析、章节练习与专项训练、模拟考试、错题本与收藏夹、学习打卡与目标管理、题库和组卷维护)
前端·javascript·spring boot·spring·数据分析·echarts
步行cgn2 天前
Spring 基于 XML 的自动装配:byType 详解
java·后端·spring
边境悍匪2 天前
蜗牛学苑 Java 智能体学习 Day46|贯穿项目 2 思维导图复盘
java·开发语言·vue.js·学习·spring
步行cgn2 天前
Spring c 命名空间注入详解
java·后端·spring
需要8262 天前
MySQL 索引 B+ 树与“查询为什么变慢了
java·spring boot·spring·spring cloud·tomcat