策略模式结合工厂模式实现动态配置
前提:需要实现可配置的策略规则转换,要求扩展性,无需更改业务代码
1.1 策略接口:继承InitializingBean接口,策略实现类注入ioc容器,即bean生成前完成向策略工厂的注册
public interface LoadBalanceStrategy extends InitializingBean {
/**
* 加载消费者列表
*/
void loadConsumer();
/**
* 抽象获取任务消费者方法
* @return 返回任务的消费者
*/
String getConsumer();
}
1.2 策略实现类
public class RoundRobinStrategy implements LoadBalanceStrategy {
private final static String STRATEGY_NAME = "roundRobin";
/**
* 获取任务的消费者
*/
@Override
public String getConsumer(){
...
}
/**
* 加载消费者
*/
@Override
public void loadConsumer() {
...
}
/**
* 自定义初始化操作,注入spring容器时进入策略容器
*/
@Override
public void afterPropertiesSet() {
LbStrategyFactory.register(STRATEGY_NAME,this);
}
}
1.3 策略工厂类
public class LbStrategyFactory {
/**
* 存储策略的集合容器
*/
private final static ConcurrentHashMap<String, LoadBalanceStrategy> STRATEGY_MAP = new ConcurrentHashMap<>();
/**
* 默认策略名称
*/
private final static String DEFAULT_STRATEGY_NAME = "roundRobin";
/**
* 根据策略类的名字返回策略类
*/
public static LoadBalanceStrategy getInvokeStrategy(String name){
if (!STRATEGY_MAP.containsKey(name)) {
//设置轮询策略为默认策略
return STRATEGY_MAP.get(DEFAULT_STRATEGY_NAME);
}
return STRATEGY_MAP.get(name);
}
/**
* 新增策略类初始化之后调用该方法 put到策略集合
*/
public static void register(String name, LoadBalanceStrategy loadBalanceStrategy) {
if (loadBalanceStrategy == null){
return;
}
STRATEGY_MAP.put(name, loadBalanceStrategy);
}
}