栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

策略模式实战(SpingBoot版)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

策略模式实战(SpingBoot版)

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

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

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

前端请求

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

后端接口 1. 创建一个通用策略接口
public interface HandleData {
    
    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;
    
    @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;

    
    @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);
        });
    }

    
    public void resolve(Integer key) {
        HandleData handleData = handleDataMap.get(key);
        handleData.resolveMethod();
    }
}
4. 执行结果,demo

4.1 传入的key为2时

4.2 传入的key为1时

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/826547.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号