Apache的Common-Chain
Common-Chain是组织复杂处理流“责任链”模式的一种流行技术,正如经典的“Gang of Four”设计模式书中描述的那样。虽然实现这种设计模式所需的基本API契约非常简单,但是有一个基础API有助于使用该模式,并且(更重要的是)鼓励来自多个不同来源的命令实现的组合。它使用“上下文”抽象旨在将命令实现与运行它们的环境隔离开来(例如,可以在Servlet或Portlet中使用的命令,而不必直接绑定到这些环境中的任何一个的API契约)。并最大限度地发挥责任链模式api的效用,基本接口契约以一种除了合适的JDK之外没有依赖关系的方式定义。提供了这些api的便利基类实现,以及web环境(即servlet和portlets)的更专业的实现。
Java实现
引入依赖
<dependency>
<groupId>commons-chain</groupId>
<artifactId>commons-chain</artifactId>
<version>1.2</version>
</dependency>
责任链类
@Component
public class FileChain extends ChainBase {
@Autowired
private List<Command> commandList;
/**
* 初始化责任链
*/
@PostConstruct
public void init() {
commandList.forEach(this::addCommand);
}
}
责任链上下文
@Data
@Builder
@EqualsAndHashCode(callSuper = true)
public class FileContext extends ContextBase {
private String fileName;
}
处理器
@Order(1)
@Component
public class ACommand implements Command {
@Override
public boolean execute(Context context) throws Exception {
System.out.println(2);
return false;
}
}
@Order(2)
@Component
public class BCommand implements Command {
@Override
public boolean execute(Context context) throws Exception {
System.out.println(1);
return false;
}
}
@Order(3)
@Component
public class CCommand implements Command {
@Override
public boolean execute(Context context) throws Exception {
System.out.println(3);
return false;
}
}
@Component
@Order(-1)
public class DFilter implements Filter {
@Override
public boolean postprocess(Context context, Exception exception) {
System.out.println("ddd post");
return false;
}
@Override
public boolean execute(Context context) throws Exception {
System.out.println("ddd exe");
return false;
}
}
测试效果
@RequestMapping
@RestController
public class TestController {
@Autowired
private FileChain fileChain;
@GetMapping("/t1")
public void t1() throws Exception {
FileContext fileContext = FileContext.builder().fileName("xxcc").build();
fileChain.execute(fileContext);
}
}
控制台输出
ddd exe
2
1
3
ddd post