策略模式定义: 策略模式属于行为性模式,它定义一系列的算法对象,使用时候可以使它们相互替换。 实际应用场景: 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
