一个工厂类
/**
* @yzy
*/
@Component
public class DispatchCtx {
@Autowired
private StrategyFactory strategyFactory;
/**
* @des 获取返回的业务实例
* @param memberQuery
* @param <T>
* @return
*/
public <T> T getDate(MemberQuery memberQuery){
if(Objects.isNull(memberQuery)){
throw new RuntimeException("上下文对象为空");
}
Istrategy strategy = strategyFactory.getStrategy(memberQuery.getId());
return strategy.getData(memberQuery);
}
策略中心:
使用的时Spring自带的注入Map中自动注入实现Istrategy的接口(详细可以学习下spring源码知识)
@Component
public class StrategyFactory {
@Autowired
private Map<String, Istrategy> strategy=new ConcurrentHashMap<String, Istrategy>();
/**
* @des 适配配置接口
* @param graphId
* @return
*/
public Istrategy getStrategy(String graphId){
Istrategy istrategy = strategy.get(graphId);
if(istrategy==null){
throw new RuntimeException(String.valueOf(MemberStatusEnum.MEMBER_ERROR.getCode()));
}
return istrategy;
}
接口:
public interface Istrategy {
public <T> T getData(MemberQuery memberQuery);
}
接口实现:
@Service(value = "price")
public class PriceServiceImpl implements Istrategy {
@Override
public MemberQuery getData(MemberQuery memberQuery) {
return new MemberQuery ();
}
}
业务实现:
在控制层 调用接口通过传入接口service注入的名称(如price或你定义的其他名称)f放入到对象ID属性中,即可实现策略的动态切换,当新增业务需求时实现Istrategy接口即可,不需要对原有的代码进行修改。