策略模式实战

策略模式实战,第1张

解释:策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

背景:在做数据处理的时候,需要根据不同的选项,进行不同的处理。

第一个想法肯定是if-else进行处理,但是试想一下如果我们后续再添加十个、二十个分配方式,还用if-else是不是就太不美观了,而且if-else的可扩展性也很差,今天我们用策略模式去做一个简单的处理。demo

前端请求

上图前端处理时的四个选项我们可以分别给它们设置key:1、2、3、4,

后端接口 1. 创建一个通用策略接口
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();
    }
}

2.3 key 为3、4同理

3. 创建扫描HandleData的bean的类

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~~

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/720520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存