chain_of_responsibility

第十五章 责任链模式(Chain of Responsibility Pattern)

1 概要

责任链模式(Chain of Responsibility Pattern)是一种行为模式(Behavior Pattern)。在责任链模式下,请求会在一条责任链上传递。具体的说,当系统收到一个请求后,会将这个请求首先发送给责任链上的第一个处理者(Request Handler)处理。如果当前处理者不能处理该请求,那么,该请求会交由下一个处理者处理。一般来说,责任链上的最后一个处理者实现了默认的处理逻辑,它能够处理所有的请求。

2 责任链模式的结构

在责任链模式中,有三类参与方。

  1. Handler表示处理者的抽象类,它定义了处理者的接口。
  2. ConcreteHandler实现了具体的处理请求的逻辑。
  3. Client接收到一个请求后,将请求交由责任链来处理。

图一 责任链模式结构图

图一 责任链模式结构图

3 责任链示例

我们使用一个商品退款的例子来解释责任链模式的使用方法。在一个在线商店的应用中,如果用户对于购买的商品不满意,用户可以申请退款(Refund)。在处理退款的过程中,我们假设普通客服人员能够处理1000圆以下的退款。如果退款超过1000圆,则需转交由客户服务经理来处理。

我们首先使用RefundRequest类来表达一个退款请求。RefundRequest类有一个成员变量amount,用于表示退款金额。

public class RefundRequest {
    private Double amount = null;

    public RefundRequest(Double amount) {
        this.amount = amount;
    }

    public Double getAmount() {
        return this.amount;
    }
}

RefundHandler类用于表示退款请求的处理者。handle()方法用于实现退款请求的逻辑。成员变量next用于指向下一个RefundHandler(退款请求的处理者)。当本RefundHandler不能处理当前请求时,会将请求转发给下一个RefundHandler。

public class RefundHandler {
    private RefundHandler next = null;

    public RefundHandler (RefundHandler next) {
        this.next = next;
    }

    public void handle(RefundRequest request) {
        if (this.next != null) {
            this.next.handle(request);
        }
    }
}

CustomerSupport继承自RefundHandler,用于实现普通客户服务人员处理退款请求的逻辑。在handle()方法中,如果退款金额小于1000圆时,该请求会由CustomerSupport处理。如果金额等于或者大于1000圆时,会调用基类的handle()方法,将请求转发给下一个RefundHandler对象。

public class CustomerSupport extends RefundHandler {
    public CustomerSupport(RefundHandler next) {
        super(next);
    }

    @Override
    public void handle(RefundRequest request) {
        if (request.amount() < 1000) {
            System.out.println("Customer Support processes the request");
        } else {
            super.handle(request);
        }
    }
}

CustomerSupportManager类实现了客户服务经理处理退款请求的逻辑。她会批准所有的退款请求。

public class CustomerSupportManager extends RefundHandler {
    public CustomerSupportManager(RefundHandler next) {
        super(next);
    }

    public void handle(RefundRequest request) {
        System.out.println("The refund request is approved.");
    }
}

在使用时,开发人员首先需要创建一条退款请求的处理责任链,将CustomerSupportManager对象设置为CustomerSupport对象的下一个请求处理对象。

当系统接收到一个退款请求后,只需将该请求对象传递给RefundHandler就可以了。如果当前RefundHandler对象不能处理该请求的话,该退款请求会在责任链上传递,直到能够被一个RefundHandler处理。

public class RefundHandlingExample {
    public static RefundHandler makeRefundHandlerChain() {
        RefundHandler manager = new CustomerSupportManager(null);
        RefundHandler customerSupport = new CustomerSupport(manager);
        return customerSupport;
    }
    public static void main(String[] args) {
        RefundHandler refundHandler = makeRefundHandlerChain();
        RefundRequest request = new RefundRequest(200);
        refundHandler.handle(request);
    }
}

4 小结

本章介绍了责任链模式的结构和使用方法。在责任链模式下,处理请求的各种场景分别实现在各个具体的Handler当中。当系统收到一个请求后,系统会将请求在责任链上传递,并且由第一个遇到的、能够处理该请求的Handler处理。责任链模式简化了各种应用场景之间的衔接。

 

上一章
下一章

注册用户登陆后可留言

Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.