文章目录
- 一、策略模式定义
- 二、例子
-
- [1. 菜鸟教程例子(略有改动)](#1. 菜鸟教程例子(略有改动))
-
- [1.1 、定义。](#1.1 、定义。)
- 1.2、定义加法策略类
- 1.3、定义乘法策略类
- [1.4、创建 Context 类](#1.4、创建 Context 类)
- 1.5、使用
- [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 {...}
三、其他设计模式
创建型模式
结构型模式
行为型模式