注入对象,改变行为。
这是一个很有意思的模式,它可以有多种表现形式,只要满足注入对象,改变行为。
学习这个模式,必须忘记网上和书上的标准类图。
案例 Comparator: Arrays.sort(T[], Comparator)
注入不同的Comparator,排序的方式也不同。
这是最常见的策略模式的表现形式,没必要画什么图。
案例 Spring 后置处理器: applyBeanPostProcessorsBeforeInstantiation
与上一个策略模式比较,有点主客颠倒的意思。
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
// 遍历所有的处理器,不同的处理器就是不同的策略
for (BeanPostProcessor bp : getBeanPostProcessors()) {
// 但是必须满足以下条件的策略才能被执行,这就叫策略模式。
// 他动态的选择策略,改变行为。
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
if (result != null) {
return result;
}
}
}
return null;
}
如果要实现新的策略,只需写个bean,或者动态的决定要不要加载自己写的bean。
案例 spring ApplicationContextAware
通过实现接口,改变类的行为和状态。
这种形式的策略和第一个案例类似。
由Spring负责在运行期间调用setApplicationContext方法,至于调用它干什么,你自己决定。
案例 spring @Enable XXX
通过在 spring 能扫描到的类上加上 @Enable XXX 注解,就会自动导入相应的功能。
大多数书籍和网上的帖子,只有第一种形式的标准类图。对于策略模式,只需要记住一句话:注入对象,改变行为。重点不在注入对象,重点在改变行为,注入对象只不过是改变行为的一种手段,是可以泛化的,可以做扩展解释的,比如之后的案例,虽然也是注入对象了,但并不像第一案例那样直截了当。