Java责任链模式实战及日常开发应用场景

熟悉spring mvc的同学都知道,它在处理请求的时候每个请求都会经过拦截器进行处理,拦截器接口内部定义了处理请求前和请求后的方法,只要实现了该拦截器接口就可以对请求进行相应的处理,这使用的正是责任链模式。我在新入职一家公司后,敏捷开发进行版本迭代,在接到新需求,并确定需求后,基于前同事的代码进行二次开发,发现在一个类中堆了一坨代码,大概一千多行,而在该类中有一个核心方法,它会调用整个类中其他所有的方法。伪代码如下

    public void handle() {
        //调用外部接口获取数据写入param对象
        writexxx(param);
        writexxx(param);
        writexxx(param);
        ...
        writexxx(param);
        writexxx(param);
        writexxx(param);
        //将param对象入库
        xxxMapper(param)
    }

而这种代码调用方式我认为很适合使用责任链模式,所以看到这坨代码时,非常想重构,但也就是想想,毕竟改别人的代码,代价是很大的。这次版本迭代就是新增外部接口的调用,写入param对象并持久化,所以我准备换种方式实现,让业务可以横向拓展,而不是继续在这个类中进行疯狂输出。

类似拦截器,新增接口定义,

public interface TestHandler {

    void handler(Param param);
}

具体实现类在handler方法中调用外部接口,对param对象进行操作。@Order注解可以对xxxHandler.handler()执行顺序进行控制,

@Component
@Order(2)
public class AHandler implements TestHandler{
    @Override
    public void handler(Param param) {
        User user = param.getUser();
        user.setName("james");
    }
}
@Component
@Order(1)
public class BHandler implements TestHandler{
    @Override
    public void handler(Param param) {
        User user = param.getUser();
        user.setEmail("243243");
    }
}

改造handl()方法,在该类定义TestHandler集合属性并注入具体实现,通过for循环调用handler方法

@Resource
List handlers;
   
 public void handle() {
        //调用外部接口获取数据写入param对象
        writexxx(param);
        writexxx(param);
        writexxx(param);
        ...
        writexxx(param);
        for (TestHandler handler : handlers) {
            handler.handler(param);
        }
        //将param对象入库
        xxxMapper(param)
    }       

 这样就实现了对业务进行横向拓展,而不会是代码在一个类中越卷越多,最后烂到底。

你可能感兴趣的:(设计模式,java,责任链模式)