Spring中如何使用策略模式避免过多if-else代码

简介: 1、场景描述我们经常在项目中,会看到如下所示if-else过多的代码。如果条件过多的话逻辑就比较混乱,也容易出错。如果新增一种业务,又要来增加一个if else,即难以维护,阅读性也很差。

1、场景描述


我们经常在项目中,会看到如下所示if-else过多的代码。如果条件过多的话逻辑就比较混乱,也容易出错。如果新增一种业务,又要来增加一个if else,即难以维护,阅读性也很差。

if(a){
}else if(b){
}else if(c){
}else{
}
复制代码

什么是策略模式?

策略模式是一种解耦的方法,它对算法进行封装,使得算法的调用和算法本身分离。使用策略模式,客户端代码不需要调整,算法之间可以互相替换,因为不同的算法实现的是同一个接口。

下面我们就以一个实际例子讲解如何使用策略模式避免使用过多的if-else语句。


2、定义策略接口

public interface BusinessExecutor {
  void handleMessage(String record);
}
复制代码


3、实现策略

根据不同策略,实现接口,重写处理逻辑。

@Slf4j
@Component("simpleBusinessExecutor")
public class SimpleBusinessExecutor implements BusinessExecutor {
  @Override
  public void handleMessage(String record) {
    log.info("simple {}", record);
  }
}
复制代码
@Slf4j
@Component("intentBusinessExecutor")
public class IntentBusinessExecutor implements BusinessExecutor {
  @Override
  public void handleMessage(String record) {
    log.info("intent {}",record);
  }
}
复制代码


4、策略管理

定义策略上下文,由于Spring IOC已经通过反射机制将类实例化到容器中了,因此我们只需要根据业务类型获取对象实例,这里我们使用ApplicationContext来获取策略对象实例Bean。

@Slf4j
@Component
public class BusinessExecutorManager {
  @Autowired
  private ApplicationContext applicationContext;
  public BusinessExecutor getExecutor(Byte type) {
    BussinessTypeEnum[] values = BussinessTypeEnum.values();
    if (values.length <= 0) {
      return null;
    }
    for (BussinessTypeEnum value : values) {
      try {
        if (Objects.equals(type, value.getCode())) {
          return (BusinessExecutor) applicationContext.getBean(value.getBeanName());
        }
      } catch (Exception e) {
        log.error("获取BusinessExecutor异常", e);
        return null;
      }
    }
    return null;
  }
}
复制代码

在这一步骤中,我们需要一种方式可以根据业务类型type来反射获取对象的实例,这里使用枚举来维护二者的对应关系。

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum BussinessTypeEnum {
  INTENT_BUSINESS(Byte.parseByte("1"), "intentBusinessExecutor", "简单业务"),
  SIMPLE_BUSINESS(Byte.parseByte("2"), "simpleBusinessExecutor", "意图业务");
  private Byte code;
  private String beanName;
  private String desc;
}
复制代码

但是这里还有一个不够优雅的地方,就是业务类型type和处理类的映射关系还是需要手动维护,不够智能。

5、运行(使用策略)

@Slf4j
@Component
public class ModelMessage {
  @Autowired
  private BusinessExecutorManager businessExecutorManager;
  protected void execute() {
                Byte bussinessType = Byte.parseByte("1");
                String message = "test";
    BusinessExecutor businessExecutor = businessExecutorManager.getExecutor(bussinessType);
    if(businessExecutor!=null){
      businessExecutor.handleMessage(message);
    }
  }
}
复制代码

结果如下:

simple test

现在,如果新增业务逻辑,只需要再增加一个类来处理策略就可以了。每个处理逻辑都互相独立互不干扰。无需增加else-if去处理新增的业务逻辑。


相关文章
|
1月前
ext portal+dwr+spring实现个性主页面拖拉效果的核心代码
ext portal+dwr+spring实现个性主页面拖拉效果的核心代码
44 6
|
19天前
|
缓存 监控 Java
|
1月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
440 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
1月前
|
存储 Java 程序员
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
本文详细讲解了Spring框架中IOC容器如何存储和取出Bean对象,包括五大类注解(@Controller、@Service、@Repository、@Component、@Configuration)和方法注解@Bean的用法,以及DI(依赖注入)的三种注入方式:属性注入、构造方法注入和Setter注入,并分析了它们的优缺点。
31 0
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
|
2月前
|
设计模式 Java Spring
spring源码设计模式分析(五)-策略模式
spring源码设计模式分析(五)-策略模式
|
3月前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
3月前
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
|
3月前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
55 0
|
3月前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
52 0
|
3月前
|
监控 安全 Java
【开发者必备】Spring Boot中自定义注解与处理器的神奇魔力:一键解锁代码新高度!
【8月更文挑战第29天】本文介绍如何在Spring Boot中利用自定义注解与处理器增强应用功能。通过定义如`@CustomProcessor`注解并结合`BeanPostProcessor`实现特定逻辑处理,如业务逻辑封装、配置管理及元数据分析等,从而提升代码整洁度与可维护性。文章详细展示了从注解定义、处理器编写到实际应用的具体步骤,并提供了实战案例,帮助开发者更好地理解和运用这一强大特性,以实现代码的高效组织与优化。
187 0
下一篇
无影云桌面