责任链模式(Chain of Responsibility Pattern)是一种行为模式(Behavior Pattern)。在责任链模式下,请求会在一条责任链上传递。具体的说,当系统收到一个请求后,会将这个请求首先发送给责任链上的第一个处理者(Request Handler)处理。如果当前处理者不能处理该请求,那么,该请求会交由下一个处理者处理。一般来说,责任链上的最后一个处理者实现了默认的处理逻辑,它能够处理所有的请求。
在责任链模式中,有三类参与方。
图一 责任链模式结构图
我们使用一个商品退款的例子来解释责任链模式的使用方法。在一个在线商店的应用中,如果用户对于购买的商品不满意,用户可以申请退款(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);
}
}
本章介绍了责任链模式的结构和使用方法。在责任链模式下,处理请求的各种场景分别实现在各个具体的Handler当中。当系统收到一个请求后,系统会将请求在责任链上传递,并且由第一个遇到的、能够处理该请求的Handler处理。责任链模式简化了各种应用场景之间的衔接。
注册用户登陆后可留言