【设计模式】Apache的Common-Chain 责任链路工具在SpringBoot中的使用

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

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值