灵活的策略模式示例

1、抽象策略

public interface Strategy<T> {

    /**
     * 获得策略的标识
     */
    T getStrategyId();
}

2、对抽象策略扩展

public interface MessageStrategy extends Strategy<String>{

   void  handler();
}

3、策略具体实现

@Component
public class AMessageStrategy implements MessageStrategy{
    @Override
    public String handler() {
        return "A ...handler";
    }

    @Override
    public String getStrategyId() {
        return "A";
    }
}

@Component
public class BMessageStrategy implements MessageStrategy{
    @Override
    public String handler() {
        return "B .. handler";
    }

    @Override
    public String getStrategyId() {
        return "B";
    }
}

4、抽象策略工厂

public class StrategyFactory<T,S extends Strategy<T>> implements InitializingBean, ApplicationContextAware {

    private   Class<S>  classType;

    private HashMap<T,S>  strategyMap;

    private  ApplicationContext applicationContext;

    public StrategyFactory(Class classType) {
        this.classType = classType;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
       Collection<S>  strategyList= applicationContext.getBeansOfType(classType).values();
        strategyMap=new HashMap<>(strategyList.size());
       for (S strategy:strategyList){
           strategyMap.put(strategy.getStrategyId(),strategy);
       }
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext=applicationContext;
    }

    public S  getStrategy(T t){
        return  strategyMap.get(t);
    }
}

5、策略类型配置

@Configuration
public class StrategyConfig {
    @Bean
    public StrategyFactory<String,MessageStrategy>  getMessageStrategy(){
        return new StrategyFactory<String,MessageStrategy>(MessageStrategy.class);
    }
}

6、测试

@Service
public class StrategyTestService {
    @Autowired
    private StrategyFactory<String,MessageStrategy> strategyFactory;

    public  String hello(String strategyId){
       MessageStrategy messageStrategy= strategyFactory.getStrategy(strategyId);
      return messageStrategy.handler();
    }
}

 
@RestController
public class StrategyController {

    @Autowired
    StrategyTestService strategyTestService;
    @RequestMapping("/strategy")
    public String strategy(String strategyId){
        return strategyTestService.hello(strategyId);
    }
}

在这里插入图片描述
在这里插入图片描述

你可能感兴趣的:(策略模式)