设计模式与简单应用之策略模式

4 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值