亦称:职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility
责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。
假如你正在开发一个在线订购系统。 你希望对系统访问进行限制, 只允许认证用户创建订单。 此外, 拥有管理权限的用户也拥有所有订单的完全访问权限。
简单规划后, 你会意识到这些检查必须依次进行。 只要接收到包含用户凭据的请求, 应用程序就可尝试对进入系统的用户进行认证。 但如果由于用户凭据不正确而导致认证失败, 那就没有必要进行后续检查了。
与许多其他行为设计模式一样, 责任链会将特定行为转换为被称作_处理者_的独立对象。 在上述示例中, 每个检查步骤都可被抽取为仅有单个方法的类, 并执行检查操作。 请求及其数据则会被作为参数传递给该方法。
模式建议你将这些处理者连成一条链。 链上的每个处理者都有一个成员变量来保存对于下一处理者的引用。 除了处理请求外, 处理者还负责沿着链传递请求。 请求会在链上移动, 直至所有处理者都有机会对其进行处理。
最重要的是: 处理者可以决定不再沿着链传递请求, 这可高效地取消所有后续处理步骤。
在我们的订购系统示例中, 处理者会在进行请求处理工作后决定是否继续沿着链传递请求。 如果请求中包含正确的数据, 所有处理者都将执行自己的主要行为, 无论该行为是身份验证还是数据缓存。
责任链模式结构
Java 示例代码:
public class ChainOfResponsibilityPattern {
public static void main(String[] args) {
Handler fudaoyuan = new FuDaoYuan();
Handler yuanzhang = new YuanZhang();
Handler xiaozhang = new XiaoZhang();
fudaoyuan.setNext(yuanzhang);
yuanzhang.setNext(xiaozhang);
fudaoyuan.HandlerRequest(31);
}
}
abstract class Handler {
protected Handler next;
public void setNext(Handler next) {
this.next = next;
}
public abstract void HandlerRequest(int request);
}
class FuDaoYuan extends Handler { // <= 7 审批
@Override
public void HandlerRequest(int request) {
if (request <= 7) {
System.out.println(“辅导员审批通过”);
} else {
if (next != null) {
next.HandlerRequest(request);
} else {
System.out.println(“无法审批”);
}
}
}
}
class YuanZhang extends Handler { // <= 15 审批
@Override
public void HandlerRequest(int request) {
if (request <= 15) {
System.out.println(“院长审批通过”);
} else {
if (next != null) {
next.HandlerRequest(request);
} else {
System.out.println(“无法审批”);
}
}
}
}
class XiaoZhang extends Handler { // <= 30 审批
@Override
public void HandlerRequest(int request) {
if (request <= 30) {
System.out.println(“校长审批通过”);
} else {
if (next != null) {
next.HandlerRequest(request);
} else {
System.out.println(“无法审批”);
}
}
}
}