今天是2021-2-25。
一。策略模式简介
1.策略模式(Strategy Pattern)是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。策略模式定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
2.简单来说,对于同一个问题的不同解决方式类,提供一个统一的接口供外部使用。
3.在策略模式中,通常有一个通用接口Strategy,我们定义的不同算法都会实现这个接口。接下来,对于解决某种问题的算法,就需要定义一个管理器类,这个管理器类会持有一个存储Strategy类型的list集合(根据需求也可以使用map或者set)–存储解决该类问题的所有算法策略。
4.通过这个集合,你就可以进行各种操作:遍历集合,查找能够处理传入对象的策略;根据id获取某个策略;给集合中设置新的策略。
5.使用时,我们的业务类就可以通过管理器类的对象操作策略集合了。
6.可以说,策略模式与工厂模式还是比较像的,只不过工厂模式注重返回不同对象,而策略模式注重对策略的管理与操作。
在学习尚硅谷springboot2时,就见识了大师优雅的代码,下面附上简单流程:
1.解析参数时,策略类通用接口HandlerMethodArgumentResolver
/**
* Strategy interface for resolving method parameters into argument values
* in the context of a given {@link Message}.
*
* @author Rossen Stoyanchev
* @since 4.0
*/
public interface HandlerMethodArgumentResolver {
/**
* Whether the given {@linkplain MethodParameter method parameter} is
* supported by this resolver.
* @param parameter the method parameter to check
* @return {@code true} if this resolver supports the supplied parameter;
* {@code false} otherwise
*/
boolean supportsParameter(MethodParameter parameter);
/**
* Resolves a method parameter into an argument value from a given message.
* @param parameter the method parameter to resolve.
* This parameter must have previously been passed to
* {@link #supportsParameter(org.springframework.core.MethodParameter)}
* which must have returned {@code true}.
* @param message the currently processed message
* @return the resolved argument value, or {@code null}
* @throws Exception in case of errors with the preparation of argument values
*/
@Nullable
Object resolveArgument(MethodParameter parameter, Message<?> message) throws Exception;
}
2.参数解析策略的管理器类HandlerMethodArgumentResolverComposite ,里面就是对参数解析器集合的各种操作
ublic class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {
//参数解析器集合
private final List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<>();
private final Map<MethodParameter, HandlerMethodArgumentResolver> argumentResolverCache =
new ConcurrentHashMap<>(256);
/**
* Add the given {@link HandlerMethodArgumentResolver}.
*/
public HandlerMethodArgumentResolverComposite addResolver(HandlerMethodArgumentResolver resolver) {
this.argumentResolvers.add(resolver)