如果让你实现一个pipeline模式?如何实现,让代码看起来不那么臃肿。
首先需要考虑,它是一个链路的流程,同时具备一个固定的模式进行着。此时,我们就可以考虑使用pipeline模式。pipeline模式中的两大重要的操作:
组装和处理
也即:定义handler和pipeline,进行pipeline组装和handler处理
因为只要组装成pipeline后,才可以进行流水线的操作。
因此,我们可以基于pipeline的骨架,然后实现一个简单的案例,而这个案例可能就是你需要的有序操作。通常适应的场景,比如业务逻辑,需要按照顺序执行,不能并行的时候,就可以使用。
一、定义处理的handler接口
public interface Handler<I,O> { O proccess(I input); }
二、定义pipeline,组装数据和执行数据处理
public class Pipeline<I,O> { // 定义handler private final Handler<I,O> currentHandler; public Pipeline(Handler<I, O> currentHandler) { this.currentHandler = currentHandler; } //添加处理数据的handler public <K> Pipeline<I,K> addHandler(Handler<O, K> newHandler) { return new Pipeline<>(input -> newHandler.proccess(currentHandler.proccess(input))); } //执行对应handler的处理 public O execute(I input) { return currentHandler.proccess(input); } }
三、定义处理业务逻辑的handler,这里主要有两个
public class Test1Handler implements Handler<Integer,Integer> { @Override public Integer proccess(Integer input) { Integer num = input + 2; System.out.println("Test1Handler==="+num); return num; } }
public class Test2Handler implements Handler<Integer,Integer> { @Override public Integer proccess(Integer input) { Integer num = input + 3; System.out.println("Test2Handler==="+num); return num; } }
四、执行组装和具体业务结果返回
public class HandlerDemoTest { @Test public void testAddHandlersToPipeline() { Pipeline pipelineResult = new Pipeline<>(new Test1Handler()).addHandler(new Test2Handler()); Integer number = 1; Integer nums = (Integer) pipelineResult.execute(number); System.out.println(nums); } }
可以看到具体的骨架就只有两个类,然后组装是基于 Pipeline pipelineResult = new Pipeline<>(new Test1Handler()).addHandler(new Test2Handler());进行组装的,而处理的逻辑是基于 pipelineResult.execute(number)实现的。
看到这里是不是直接也想去试一下。