JavaScript设计模式——责任链模式

75 阅读1分钟

介绍

责任链模式,它允许将请求沿着处理链传递,直到有一个处理者能够处理该请求为止。

主要概念:

  1. 处理者接口(Handle Interface):定义处理接口的请求,通常包含一个处理方法。
  2. 具体处理者(Conreate Handler): 实现处理者接口,负责处理请求,如果自己无法处理,则将请求传递给下一个处理者。
  3. 客户端(Client):创建责任链并向其发送请求。

ts代码

// 定义处理者接口
interface Handler {
  setNext(handler: Handler): Handler
  handleRequest(amount: number): void
}

// 具体处理者 - CEO
class CEO implements Handler {
  private nextHandler: Handler | null

  constructor() {
    this.nextHandler = null
  }

  setNext(handler: Handler): Handler {
    this.nextHandler = handler
    return handler // 链模式
  }

  handleRequest(amount: number) {
    if (amount > 1000) {
      console.log('CEO 批准了该购买请求');
    } else if (this.nextHandler) {
      this.nextHandler.handleRequest(amount)
    } else {
      console.log('无人处理该购买请求');
    }
  }
}

// 具体处理者 - VP
class VP implements Handler {
  private nextHandler: Handler | null

  constructor() {
    this.nextHandler = null
  }

  setNext(handler: Handler): Handler {
    this.nextHandler = handler
    return handler 
  }

  handleRequest(amount: number) {
    if (amount > 500 && amount <= 1000) {
      console.log('副总裁批准了该购买请求');
    } else if (this.nextHandler) {
      this.nextHandler.handleRequest(amount)
    } else {
      console.log('无人处理该购买请求');
    }
  }
}

// 具体处理者 - Manager
class Manager implements Handler {
  private nextHandler: Handler | null

  constructor() {
    this.nextHandler = null
  }

  setNext(handler: Handler): Handler {
    this.nextHandler = handler
    return handler 
  }

  handleRequest(amount: number) {
    if (amount <= 500) {
      console.log('经理批准了该购买请求');
    } else if (this.nextHandler) {
      this.nextHandler.handleRequest(amount);
    } else {
      console.log('无人处理该购买请求');
    }
  }
}

// 创建责任链并发送请求
const ceo = new CEO();
const vp = new VP();
const manager = new Manager();

manager.setNext(vp).setNext(ceo);
// vp.setNext(ceo);

manager.handleRequest(300);

manager.handleRequest(800);

manager.handleRequest(1200);