世外云

js 责任链

责任链模式是一种行为设计模式,它允许多个对象处理请求,将这些对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止,在JavaScript中,我们可以使用责任链模式来处理请求,以提高代码的可维护性和扩展性。

js 责任链-图1

我们需要定义一个基本的处理器类,它将作为责任链模式的基础,这个类需要包含一个指向下一个处理器的引用,以及一个用于处理请求的方法。

class Handler {
  constructor(next = null) {
    this.next = next;
  }

  handleRequest(request) {
    // 在这里处理请求,如果无法处理,则将请求传递给下一个处理器
    if (this.canHandle(request)) {
      return this.handle(request);
    } else if (this.next) {
      return this.next.handleRequest(request);
    } else {
      throw new Error('没有处理器可以处理该请求');
    }
  }

  canHandle(request) {
    // 在这里判断当前处理器是否可以处理请求
    return true; // 默认可以处理所有请求
  }

  handle(request) {
    // 在这里实现具体的请求处理逻辑
    console.log(`处理器${this.constructor.name}处理了请求:${request}`);
  }
}

接下来,我们可以创建一些具体的处理器类,继承自`Handler`类,并实现`canHandle`和`handle`方法,这些处理器可以根据请求的类型或内容来判断是否可以处理请求,以及如何处理请求。

class ConcreteHandler1 extends Handler {
  canHandle(request) {
    return request === 'A';
  }

  handle(request) {
    console.log(`处理器ConcreteHandler1处理了请求:${request}`);
  }
}

class ConcreteHandler2 extends Handler {
  canHandle(request) {
    return request === 'B';
  }

  handle(request) {
    console.log(`处理器ConcreteHandler2处理了请求:${request}`);
  }
}

我们可以创建一个责任链,将处理器按照顺序连接起来,我们可以使用`handleRequest`方法来发送请求,责任链会将请求传递给第一个可以处理它的处理器。

```javascript

const handler1 = new ConcreteHandler1();

const handler2 = new ConcreteHandler2();

handler1.next = handler2; // 将handler2连接到handler1后面,形成责任链

handler1.handleRequest('A'); // 输出:处理器ConcreteHandler1处理了请求:A;处理器ConcreteHandler2处理了请求:A;handler1.handleRequest('B'); // 输出:处理器ConcreteHandler2处理了请求:B;handler1.handleRequest('C'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('D'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('E'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('F'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('G'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('H'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('I'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('J'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('K'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('L'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('M'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('N'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('O'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('P'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('Q'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('R'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('S'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('T'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('U'); // 输出:没有处理器可以处理该请求;抛出错误:没有处理器可以处理该请求;throw new Error('没有处理器可以处理该请求');handler1.handleRequest('V'); // 输出:没有处理器可以处理该请求;抛出错误:没有

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
请登录后评论...
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~