Java 责任链模式demo

BaseValidateChain

public abstract class BaseValidateChain {

    // 当前处理节点
    protected BaseValidateChain chain;

    // 设置下一个处理者
    public void setNextChain(BaseValidateChain nextChain) {
        this.chain = nextChain;
    }

    // 处理方法,每一个处理者要实现该方法
    public abstract Response<OrderApplyResultVo> proceed(ValidateContext context, OrderApplyResultVo orderApplyResultVo);

    public static class Builder {
        // 分别记录第一个处理者和下一个处理者,类似于链表结构
        private BaseValidateChain head;
        private BaseValidateChain tail;

        // 添加处理者
        public Builder addChain(BaseValidateChain chain) {
            if (this.head == null) {
                this.head = this.tail = chain;
                return this;
            }
            // 设置下一个处理者
            this.tail.setNextChain(chain);
            this.tail = chain;
            return this;
        }

        public BaseValidateChain build() {
            return this.head;
        }
    }


}

实现类

@Service
@Slf4j
public class AirlineValidateChain extends BaseValidateChain {

    @Resource
    private OrderService orderService;
    @Resource
    private OrderDataServiceFactory orderDataServiceFactory;
    @Resource
    private ProductBasicBiz productBasicBiz;

    @Override
    public Response<OrderApplyResultVo> proceed(ValidateContext context, OrderApplyResultVo orderApplyResultVo) {
        log.info("延航险校验 begin");
        // do something
        if (Objects.nonNull(chain)){
            log.info("延航险校验 end next validate");
            return chain.proceed(context, orderApplyResultVo);
        }

        return ResponseUtil.makeSuccess(orderApplyResultVo);
    }
}
@Service
@Slf4j
public class AnnuityValidateChain extends BaseValidateChain {

    @Resource
    private OrderService orderService;
    @Resource
    private OrderDataServiceFactory orderDataServiceFactory;
    @Resource
    private ProductBasicBiz productBasicBiz;


    @Override
    public Response<OrderApplyResultVo> proceed(ValidateContext context, OrderApplyResultVo orderApplyResultVo) {
        ApplyReqParam applyReqParam = context.getApplyReqParam();
        log.info("校验 begin");
        // do something
        if (Objects.nonNull(chain)){
            log.info("校验 end next validate");
            return chain.proceed(context, orderApplyResultVo);
        }
        return ResponseUtil.makeSuccess(orderApplyResultVo);
    }
}

形成链条

 new BaseValidateChain.Builder()
                .addChain(airlineValidateChain)
                .addChain(annuityValidateChain)
                .build();
        Response<OrderApplyResultVo> voResponse = airlineValidateChain.proceed(context, orderApplyResultVo);

责任链模式是一种行为型设计模式,它允许你将请求沿着处理者链进行发送,直到其中一个处理者能够处理它为止。每个处理者都有一个对下一个处理者的引用,形成了一个链式结构。 这种模式的优点在于它可以动态地组合处理者链,而不需要修改现有代码。它还允许您以灵活的方式为请求选择处理者。 下面是一个简单的Java示例,演示了如何使用责任链模式。我们将创建一个处理器链,每个处理器都能处理特定类型的请求: 首先,我们需要定义一个请求类,它将包含要处理的数据: ```java public class Request { private String requestType; private String requestData; public Request(String requestType, String requestData) { this.requestType = requestType; this.requestData = requestData; } public String getRequestType() { return requestType; } public String getRequestData() { return requestData; } } ``` 接下来,我们需要定义一个处理器接口,它将定义处理请求的方法: ```java public interface RequestHandler { void handleRequest(Request request); } ``` 然后,我们将实现几个具体处理器类,分别处理不同类型的请求: ```java public class EmailHandler implements RequestHandler { private RequestHandler nextHandler; public void setNextHandler(RequestHandler handler) { nextHandler = handler; } public void handleRequest(Request request) { if (request.getRequestType().equals("email")) { System.out.println("EmailHandler handles request: " + request.getRequestData()); } else if (nextHandler != null) { nextHandler.handleRequest(request); } else { System.out.println("No handler found for request: " + request.getRequestType()); } } } public class FaxHandler implements RequestHandler { private RequestHandler nextHandler; public void setNextHandler(RequestHandler handler) { nextHandler = handler; } public void handleRequest(Request request) { if (request.getRequestType().equals("fax")) { System.out.println("FaxHandler handles request: " + request.getRequestData()); } else if (nextHandler != null) { nextHandler.handleRequest(request); } else { System.out.println("No handler found for request: " + request.getRequestType()); } } } public class LetterHandler implements RequestHandler { private RequestHandler nextHandler; public void setNextHandler(RequestHandler handler) { nextHandler = handler; } public void handleRequest(Request request) { if (request.getRequestType().equals("letter")) { System.out.println("LetterHandler handles request: " + request.getRequestData()); } else if (nextHandler != null) { nextHandler.handleRequest(request); } else { System.out.println("No handler found for request: " + request.getRequestType()); } } } ``` 最后,我们将使用这些处理器类创建一个处理器链,并将请求发送到该链: ```java public class ChainDemo { private static RequestHandler getChainOfHandlers() { RequestHandler emailHandler = new EmailHandler(); RequestHandler faxHandler = new FaxHandler(); RequestHandler letterHandler = new LetterHandler(); emailHandler.setNextHandler(faxHandler); faxHandler.setNextHandler(letterHandler); return emailHandler; } public static void main(String[] args) { RequestHandler chain = getChainOfHandlers(); chain.handleRequest(new Request("email", "Email request")); chain.handleRequest(new Request("fax", "Fax request")); chain.handleRequest(new Request("letter", "Letter request")); chain.handleRequest(new Request("unknown", "Unknown request")); } } ``` 当我们运行该程序时,它将输出以下结果: ``` EmailHandler handles request: Email request FaxHandler handles request: Fax request LetterHandler handles request: Letter request No handler found for request: unknown ``` 这个例子演示了如何使用责任链模式来处理请求。在这个例子中,我们创建了一个处理器链,每个处理器都可以处理特定类型的请求。当请求到达链的顶部时,它将沿着链向下传递,直到找到可以处理它的处理器为止。如果没有处理器能够处理请求,则会输出一条错误消息。 总之,责任链模式可以让您以灵活和可扩展的方式组织代码,并将请求发送到处理器链中,直到找到可以处理它的处理器为止。这种模式可以用于许多不同的场景,例如请求处理、日志记录和异常处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值