解释:策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
背景:在做数据处理的时候,需要根据不同的选项,进行不同的处理。
前端请求第一个想法肯定是if-else进行处理,但是试想一下如果我们后续再添加十个、二十个分配方式,还用if-else是不是就太不美观了,而且if-else的可扩展性也很差,今天我们用
策略模式
去做一个简单的处理。demo
后端接口 1. 创建一个通用策略接口上图前端处理时的四个选项我们可以分别给它们设置key:1、2、3、4,
public interface HandleData {
/**
* 定义选择的key类型
*
* @return
*/
Integer key();
/**
* 处理方法
*/
void resolveMethod();
}
2. 实现类
注:OneHandleService和TwoHandleService均为自定义的处理方法,本文不再贴出代码
2.1 key为1时的实现类(不要忘记@Component,将处理方法注册到spring容器中)
@Component
public class OneHandle implements HandleData {
//
@Autowired
private OneHandleService service;
private final Integer key = 1;
/**
* 定义选择的key类型
*
* @return
*/
@Override
public Integer key() {
// 开发时可以使用枚举,这里省略
return key;
}
/**
* 处理方法
*/
@Override
public void resolveMethod() {
// key为1时的处理方法
service.oneHandleDemo();
}
}
2.2 key为2时的实现类(不要忘记@Component,将处理方法注册到spring容器中)
@Component
public class TwoHandle implements HandleData {
@Autowired
private TwoHandleService service;
private final Integer key = 2;
/**
* 定义选择的key类型
*
* @return
*/
@Override
public Integer key() {
return key;
}
/**
* 处理方法
*/
@Override
public void resolveMethod() {
service.twoHandleDemo();
}
}
3. 创建扫描HandleData的bean的类2.3 key 为3、4同理
setApplicationContext方法是将OneHandle和TwoHandle的bean扫描并存到map中。
resolve方法是为了根据不同的key,执行不同的方法。
@Component
public class HandleContext implements ApplicationContextAware {
private Map handleDataMap = new HashMap<>();
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// 获取HandleData的所有bean对象
Map beansOfType = applicationContext.getBeansOfType(HandleData.class);
beansOfType.values().stream().forEach(item -> {
handleDataMap.put(item.key(), item);
});
}
/**
* 根据map值获取对象的HandleData对象,然后调用HandleData对象的处理方法
*
* @param key
*/
public void resolve(Integer key) {
HandleData handleData = handleDataMap.get(key);
handleData.resolveMethod();
}
}
4. 执行结果,demo
4.1 传入的key为2时
4.2 传入的key为1时
我是Tz ,想把我遇到的问题都分享给你,想看更多精彩内容,请关注我的微信公众号
zhuangtian
~~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)