策略模式定义:
策略模式属于行为性模式,它定义一系列的算法对象,使用时候可以使它们相互替换。
实际应用场景:
spring中bean的实例化,使用的是策略模式;
下面请看类图:
参考spring bean的方式做一个策略模式
1 先定义一个接口
public interface InstantiationStrategy {
/**
* 实例化bean的类
* @param bean
* @return
*/
Object instantiate(String bean);
}
2 定义接口的simple实现类
public class SimpleInstantiationStrategy implements InstantiationStrategy {
@Override
public Object instantiate(String bean) {
//对bean进行实例化
Object o = null;
try{
System.out.println("使用SimpleInstantiationStrategy来实现实例化:"+bean);
o = Class.forName(bean);
}catch (Exception e) {
}
return o;
}
}
3 定义一个CglibSubclassing的实现类,集成simple
public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationStrategy {
@Override
public Object instantiate(String bean) {
//对bean进行实例化
return new CglibSubclassCreator().instantiate(bean);
}
private static class CglibSubclassCreator {
public Object instantiate(String bean) {
//对bean进行实例化
Object o = null;
try{
System.out.println("使用CglibSubclassingInstantiationStrategy来实现实例化:"+bean);
o = Class.forName(bean);
}catch (Exception e) {
}
return o;
}
}
}
4 定义spring 中的factory,我们这里简化了,所以改了下名字
public class AutowireCapableBeanContext {
private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
public Object autowire(String bean) {
return instantiationStrategy.instantiate(bean);
}
public InstantiationStrategy getInstantiationStrategy() {
return instantiationStrategy;
}
/**
* 如果不使用默认的,则提供一个设置的路径
* @param instantiationStrategy
*/
public void setInstantiationStrategy(InstantiationStrategy instantiationStrategy) {
this.instantiationStrategy = instantiationStrategy;
}
}
5 定义调用类
public class Test {
public static void main(String[] args) {
AutowireCapableBeanContext a = new AutowireCapableBeanContext();
a.autowire("java.lang.Integer");
a.setInstantiationStrategy(new SimpleInstantiationStrategy());
a.autowire("java.lang.String");
}
}
运行后的结果为:
使用CglibSubclassingInstantiationStrategy来实现实例化:java.lang.Integer
使用SimpleInstantiationStrategy来实现实例化:java.lang.String
另外:
在我们实现的这个例子中,CglibSubclassingInstantiationStrategy纯粹是为了模仿spring做的,他可以实现InstantiationStrategy接口的方式来做
源码地址:https://gitee.com/xj-louge/pattern.git