javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JS责任链模式

JS设计模式之责任链模式应用详解

作者:慕仲卿

JS责任链模式是一种行为型设计模式,它允许多个对象按照顺序处理请求,直到其中一个对象能够处理请求为止,这样的对象链被称为责任链,本文将给大家详细讲讲责任链模式在JS中的应用,需要的朋友可以参考下

责任链模式(Chain of Responsibility Pattern)

定义:

一种行为型设计模式,它允许多个对象按照顺序处理请求,直到其中一个对象能够处理请求为止。这样的对象链被称为责任链。

特点:

参与者:

工作流程:

优点:

缺点:

使用场景:

示例:

// 抽象处理器
class Handler {
  nextHandler: Handler|null = null;
  setNext(handler: Handler) {
    this.nextHandler = handler;
  }
  abstract handleRequest(request: number): void;
}
// 具体处理器1
class ConcreteHandler1 extends Handler {
  handleRequest(request: number) {
    request <= 10 ? console.log(`Request ${request} handled by ConcreteHandler1`) : this.nextHandler?.handleRequest(request);
  }
}
// 具体处理器2
class ConcreteHandler2 extends Handler {
  handleRequest(request: number) {
    request > 10 && request <= 20 ? console.log(`Request ${request} handled by ConcreteHandler2`) : this.nextHandler?.handleRequest(request);
  }
}
// 具体处理器3
class ConcreteHandler3 extends Handler {
  handleRequest(request) {
    request > 20 && request <= 80 ? console.log(`Request ${request} handled by ConcreteHandler3`) : this.nextHandler?.handleRequest(request);
  }
}
// 异常处理器
class ConcreteHandlerX extends Handler {
  handleRequest(request) {
    throw new Error(`Request ${request} can not be handled by ConcreteHandler chain`);
  }
}
// 创建处理对象
const handler1 = new ConcreteHandler1();
const handler2 = new ConcreteHandler2();
const handler3 = new ConcreteHandler3();
const errorhandler = new ConcreteHandlerX();
// 处理对象成链
handler1.setNext(handler2);
handler2.setNext(handler3);
handler3.setNext(errorhandler);
// 客户端发送请求
handler1.handleRequest(5);   // 输出: Request 5 handled by ConcreteHandler1
handler2.handleRequest(15);  // 输出: Request 15 handled by ConcreteHandler2
handler3.handleRequest(25);  // 输出: Request 25 handled by ConcreteHandler3
handler1.handleRequest(90);  // 直接报错

原生实现:

总结:

构建抽象处理器类,然后子类具体处理器类重写处理逻辑;实际化出不同的具体处理器类的实例对象,调用setNext方法成链,然后选择链中某处作为入口,处理责任。

注意:不必从入口开始,因为可能在入链之前就已经判断过了,范围已经缩小了。

扩展:

链可以成环,例如将handler3.setNext(errorhandler);改成handler3.setNext(handler1);, 从而责任传递永无停息,直到问题被解决。

用责任环结合定时器可以实现轮询的效果。

到此这篇关于JS设计模式之责任链模式应用详解的文章就介绍到这了,更多相关JS责任链模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文