策略模式实战(SpingBoot版)

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

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

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

前端请求

image.png

上图前端处理时的四个选项我们可以分别给它们设置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<Integer, HandleData> handleDataMap = new HashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 获取HandleData的所有bean对象
        Map<String, HandleData> 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时

image.png

4.2 传入的key为1时

image.png

我是Tz ,想把我遇到的问题都分享给你,想看更多精彩内容,请关注我的微信公众号zhuangtian~~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值