策略模式结合工厂模式实现动态配置

策略模式结合工厂模式实现动态配置

前提:需要实现可配置的策略规则转换,要求扩展性,无需更改业务代码

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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_47407737/article/details/127928531
今日推荐