策略模式结合spring使用最佳实战,老程序员才这么写

策略模式结合spring使用

我们在项目中经常会遇到if else 特别多的情况,比如前端传了一个type,不同type 数据处理的流程逻辑也不相同,正常情况我们会怎么做呢?就会像下面一样:

if("aa".equals(type)){
    //一顿处理
}else if("bb".equals(type)){
    //又是一顿处理
}else if(){
    
}else if(){
    
}else if(){
    
}

当然了,自己写的呢我们自己肯定可以看懂了,无所谓啦但是如果让别人看到肯定是这样了:

但是大家都不想写出这样的代码,这时有人就会说了:"没办法啊,刚开始产品给出的需求没有这么多的逻辑 随着产品的需求的迭代,项目时间紧只能在原有的代码上if else了,我们也是无辜的啊!"

确实这是没法避免的 所以一种就是靠自己的项目经验在开始写的时候就知道后续有可能出现这种情况,第二种就是在逻辑判断多的时候及时重构代码(最苦逼了)

说了这么多接下来就是带着大家怎么解决这种 if else多的问题了 这里我使用的是策略模式

fd95cd6711ff93e32ad81dd2707235a9.gif

成品代码如下 controller 层

@PostMapping("/action")
  public String action(@RequestBody ActionVO actionVO){
    //大致就是这个思想 具体的细节 需要 你们自己补充啦  什么日志 异常啥的 自己处理一下  爱你们
    ActionHandler actionHandler = actionHandlerFactory.getRoutMap().get(actionVO.getType());
    if(actionHandler!=null){
      actionHandler.handler(actionVO);
    }
    return "success";
public class ActionHandlerFactory {
  private static Map<Byte, ActionHandler> ROUT_MAP;

  @Autowired
  private TeacherActionHandler teacherActionHandler;
  @Autowired
  private UserActionHandler userActionHandler;
  @PostConstruct
  private void init(){
    ROUT_MAP= ImmutableMap.<Byte,ActionHandler>builder()
        .put(ActionEnum.USER.getType(),userActionHandler)
        .put(ActionEnum.TEACHER.getType(),teacherActionHandler).build();
  }

  public Map<Byte,ActionHandler> getRoutMap(){
    return ROUT_MAP;
  }
}

真的没有 if else 了,其实是将真正执行代码的handler放在了map中 这样是不是变得优雅了不少啊!


你想变得更加优雅吗 如果你想变得更加优雅 我带你继续研究像我这次的执行业务逻辑的代码 类的继承结构图如下44ec17096889204e06ed1be27b16c2d7.png

RequestHandler 

public interface RequestHandler<T> {


  public void handler(T t);


  public void write(T t);


  public void read(T t);
public abstract class ActionHandler implements RequestHandler<ActionVO> {

  @Override
  public void handler(ActionVO actionVO) {
    read(actionVO);
    write(actionVO);
    insert(actionVO);
  }

  @Override
  public void write(ActionVO actionVO) {

  }

  @Override
  public void read(ActionVO actionVO) {

  }

  public abstract void insert(ActionVO actionVO);


}

这里使用了一个模板模式 这样的话我们真正的业务逻辑执行类只需要继承这个ActionHandler 重写里面自己想要的方法就可以了

public class UserActionHandler extends ActionHandler{

  @Override
  public void insert(ActionVO actionVO) {
    // 就是写 Ctrl+V
    System.out.println("im user");
  }

  @Override
  public void write(ActionVO actionVO) {
    super.write(actionVO);
    //自己逻辑 就是 Ctrl+C
  }

  @Override
  public void read(ActionVO actionVO) {
    super.read(actionVO);
    //自己的逻辑 卡卡就是干
  }

附带一下这个demo引入的jar

<dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.4</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>2.1.1</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.1.4</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>21.0</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.restdocs</groupId>
      <artifactId>spring-restdocs-mockmvc</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.10</version>
    </dependency>
  </dependencies>

用了上述两种设计模式,这样再一看是不是代码更加的优雅,更加的易读了,而且在以后 改每个模块的业务逻辑的时候只需要改自己的handler就可以,也不会影响到其他的代码。

以上就是我个人的理解哈哈哈


如果有什么写的不对的地方欢迎大家给我留言指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值