实践讲解SpringBoot自定义初始化Bean+HashMap优化策略模式

 更新时间:2021年09月17日 16:25:51   作者:Simpleeee  
本篇讲解了SpringBoot自定义初始化Bean+HashMap优化策略模式,通过实践的方式更通俗易懂,对此不了解的同学跟着小编往下看吧

策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

传统的策略模式一般是创建公共接口、定义公共方法——》然后创建实体类实现公共接口、根据各自的逻辑重写公共方法——》创建一个行为随着策略对象改变而改变的 context 对象——》根据不同的传参,调用不同的接口实现类方法,达到只改变参数即可获得不同结果的目的。

但是也可以明显发现,这种策略模式的实现方式,代码量较大,而且还要自定义要传递的参数,可能会引入一定数量的if/else,有一定的优化空间,接下来,我会结合实际开发经验,分享一种策略模式的优化方式,进一步优化代码结构、减少代码量。

首先,必不可少的需要创建公共接口、定义公共方法,然后创建实体类实现公共接口、根据各自的逻辑重写公共方法,参考代码如下:

定义公共接口CommonService,以及公共方法push()

package com.itcq.service.StrategyPattern;
 
public interface CommonService {
    String push(String key);
}

创建三个不同的接口实现类,重写push()方法

package com.itcq.service.StrategyPattern;
import org.springframework.stereotype.Service;

@Service
public class TestOne implements CommonService {
    @Override
    public String push(String key) {
        return "1.这是模式:" + key;
    }
}
package com.itcq.service.StrategyPattern;

import org.springframework.stereotype.Service;

@Service
public class TestTwo implements CommonService{
    @Override
    public String push(String key) {
        return "2.这是模式:"+key;
    }
}
package com.itcq.service.StrategyPattern;
import org.springframework.stereotype.Service;

@Service
public class TestThree implements CommonService{
    @Override
    public String push(String key) {
        return "3.这是模式:"+key;
    }
}

接下来就是重点,我们利用到springboot初始化Bean的方式结合HashMap,来实现对策略模式的优化

@Service
public class TestServiceTwo implements InitializingBean {

    @Autowired
    private ApplicationContext applicationContext;

    private HashMap<String, CommonService> hashmap = new HashMap<>();

    @Override
    public void afterPropertiesSet() {

        hashmap.put(StrategyTestEnum.STRATEGY_ONE.getTitle(), new TestOne());
        hashmap.put(StrategyTestEnum.STRATEGY_TWO.getTitle(), this.applicationContext.getBean(TestTwo.class));
        hashmap.put(StrategyTestEnum.STRATEGY_THREE.getTitle(), this.applicationContext.getBean(TestThree.class));
    }
}
@Getter
public enum StrategyTestEnum {
    STRATEGY_ONE("一", "模式一"),
    STRATEGY_TWO("二", "模式二"),
    STRATEGY_THREE("三", "模式三"),
    ;

    private String title;
    private String value;

    StrategyTestEnum(String title, String value) {
        this.title = title;
        this.value = value;
    }
}

TestServiceTwo实现InitializingBean接口,InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。

定义一个hashmap集合,用来保存不同的公共接口实现类对象,这里把参数抽取成一个枚举类,利用SpringBoot的高级容器ApplicationContext,获取Bean对象,当然这里直接new一个实现类对象也是可以的,将不同的参数和实现对象封装到map集合中,实现参数和逻辑一一对应。

测试方法如下,通过hashmap的key获取对应的实现类对象,这样就不必再自定义参数类型,彻底消除了if/else,也不用暴露给方法调用者过多的业务逻辑。

public String testMethod2(String key) {

        CommonService commonService = hashmap.get(key);
        Assert.notNull(commonService, "参数错误,找不到模式");
        return commonService.push(key);
    }

最后在controller层调用方法,进行测试:

@Autowired
    private TestServiceTwo testServiceTwo;

    @GetMapping("/test/two")
    public String testMethodTwo(@RequestParam(name = "key") String key) {

        return testServiceTwo.testMethod2(key);
    }

测试结果如下:

参数正确情况下:

参数错误情况下:

利用这种自定义初始化bean+hashmap的方式完成了对策略模式的优化,优化了代码的结构,并且彻底消除了if/else,个人认为可以很好地提升代码质量。

代码改变世界

到此这篇关于实践讲解SpringBoot自定义初始化Bean+HashMap优化策略模式的文章就介绍到这了,更多相关SpringBoot Bean HashMap优化策略内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaFx Tooltip悬浮提示使用及自定义代码详解

    JavaFx Tooltip悬浮提示使用及自定义代码详解

    本篇是基于TornadoFx框架对Tooltip组件进行讲解,使用Kotlin语言,和传统Java使用有所区别,本章节包括对tooltip的样式定制化以及指定窗口显示,对JavaFx Tooltip悬浮提示使用及自定义相关知识感兴趣的朋友一起看看吧
    2021-12-12
  • listview点击无效的处理方法(推荐)

    listview点击无效的处理方法(推荐)

    下面小编就为大家带来一篇listview点击无效的处理方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • kettle中使用js调用java类的方法

    kettle中使用js调用java类的方法

    这篇文章主要介绍了kettle中使用js调用java类的方法,本文讲解了注意事项和调用语法,需要的朋友可以参考下
    2015-05-05
  • SpringBoot一个请求的处理全过程分享

    SpringBoot一个请求的处理全过程分享

    本文详细介绍了SpringBoot请求处理的全过程,包括过滤器链、拦截器链、路径映射、参数绑定、Controller方法执行、返回值处理、异常解析和视图解析渲染等步骤,同时,文中还列举了请求处理过程中常见的问题及解决方案
    2024-12-12
  • Java JDBC使用入门讲解

    Java JDBC使用入门讲解

    JDBC是指Java数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。从根本上来说,JDBC 是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库,本篇文章我们来了解MySQL连接JDBC的流程方法
    2022-12-12
  • idea生成WebServices接口的完整流程步骤

    idea生成WebServices接口的完整流程步骤

    因为工作需要,数据传输部分需要使用webservice实现,经过两天的研究,实现了一个简单的例子,这篇文章主要给大家介绍了关于idea生成WebServices接口的完整流程步骤,需要的朋友可以参考下
    2024-08-08
  • 利用Spring Cloud Config结合Bus实现分布式配置中心的步骤

    利用Spring Cloud Config结合Bus实现分布式配置中心的步骤

    这篇文章主要介绍了利用Spring Cloud Config结合Bus实现分布式配置中心的相关资料,文中通过示例代码将实现的步骤一步步介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友下面来一起看看吧
    2018-05-05
  • 深入了解java 8的函数式编程

    深入了解java 8的函数式编程

    函数式编程并不是Java新提出的概念,其与指令编程相比,强调函数的计算比指令的计算更重要;与过程化编程相比,其中函数的计算可以随时调用。下面我们来详细了解一下吧
    2019-06-06
  • 解决 IDEA Maven 项目中"Could not find artifact" 问题的常见情况和解决方案

    解决 IDEA Maven 项目中"Could not find artifact" 

    这篇文章主要介绍了解决IDEA Maven项目中Could not find artifact问题的常见情况和解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 浅析Java虚拟机详解之概述、对象生存法则

    浅析Java虚拟机详解之概述、对象生存法则

    这篇文章主要介绍了Java虚拟机详解之概述、对象生存法则,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04

最新评论