设计模式之责任链模式

亦称:职责链模式、命令链、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(“无法审批”);

}

}

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysh05

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值