es6 语法学习 - 责任链模式

es6 语法学习 - 责任链模式

一、基本概念

责任链模式(Chain of Responsibility)是一种行为设计模式,它允许你将请求沿着处理者链进行传递。每个处理者都对请求进行某些处理,并且可以决定是否将请求传递给链中的下一个处理者。这个模式使得你可以动态地添加或删除处理者,并改变请求的传递顺序。

二、 优点

  • 降低耦合度:责任链模式将请求发送者和接收者解耦
  • 增强可扩展性:可以动态地添加或修改处理链,调整处理顺序。
  • 提高灵活性:每个处理者只负责处理自己关心的请求

三、缺点

  • 性能问题:依次经过责任链上的每个处理者,处理链过长可能会影响系统的性能。
  • 复杂性增加:责任链模式可能会引入过多的类和对象,增加系统的复杂性和理解难度。
  • 请求可能漏掉:责任链没有正确配置或者最后一个处理者没有处理请求,导致问题无法得到解决。

四、使用场景

  • 日志记录系统:根据日志级别将日志消息传递给不同的日志记录器。
  • 多级审批系统:如请假审批、采购审批等,根据审批者的权限和级别将审批请求传递给下一个级别的审批者。
  • 事件处理系统:根据事件类型将事件传递给不同的处理器进行处理。

五、示例代码

在 JavaScript 中,我们可以使用 ES6 的类和函数来实现责任链模式。以下是一个简单的例子,展示了如何使用责任链模式来处理不同级别的日志消息。

// 日志级别枚举
const LogLevel = {
  ERROR: 'ERROR',
  WARN: 'WARN',
  INFO: 'INFO',
  DEBUG: 'DEBUG',
};

// 日志处理者基类
class LogHandler {
  constructor(level) {
    this.level = level;
    this.nextHandler = null;
  }

  setNextHandler(handler) {
    this.nextHandler = handler;
  }

  // 具体的处理逻辑,由子类实现
  handle(log) {
    if (this.nextHandler) {
      return this.nextHandler.handle(log);
    }
    return false; // 如果没有处理者,返回false表示未处理
  }
}

// 具体处理者:错误日志处理者
class ErrorLogHandler extends LogHandler {
  constructor() {
    super(LogLevel.ERROR);
  }

  handle(log) {
    console.log(log);
    if (log.level === LogLevel.ERROR) {
      console.error(`ErrorLogHandler: ${log.message}`);
      return true; // 表示已处理
    }
    return super.handle(log); // 传递给下一个处理者
  }
}

// 具体处理者:警告日志处理者
class WarnLogHandler extends LogHandler {
  constructor() {
    super(LogLevel.WARN);
  }

  handle(log) {
    if (log.level === LogLevel.WARN) {
      console.warn(`WarnLogHandler: ${log.message}`);
      return true; // 表示已处理
    }
    return super.handle(log); // 传递给下一个处理者
  }
}

// 具体处理者:信息日志处理者
class InfoLogHandler extends LogHandler {
  constructor() {
    super(LogLevel.INFO);
  }

  handle(log) {
    if (log.level === LogLevel.INFO) {
      console.info(`InfoLogHandler: ${log.message}`);
      return true; // 表示已处理
    }
    return super.handle(log); // 传递给下一个处理者
  }
}

// 具体处理者:调试日志处理者(可选,作为链的末尾)
class DebugLogHandler extends LogHandler {
  constructor() {
    super(LogLevel.DEBUG);
  }

  handle(log) {
    if (log.level === LogLevel.DEBUG) {
      console.debug(`DebugLogHandler: ${log.message}`);
      return true; // 表示已处理
    }
    // 在这个例子中,没有下一个处理者,所以返回false
    return false; // 表示未处理(但在这个链的末尾,这实际上不会发生)
  }
}

// 使用责任链模式
const errorHandler = new ErrorLogHandler();
const warnHandler = new WarnLogHandler();
const infoHandler = new InfoLogHandler();
const debugHandler = new DebugLogHandler();

// 设置处理者链
errorHandler.setNextHandler(warnHandler);
warnHandler.setNextHandler(infoHandler);
infoHandler.setNextHandler(debugHandler);

// 创建日志并传递给链
const logs = [
  { level: LogLevel.ERROR, message: 'This is an error message' },
  { level: LogLevel.WARN, message: 'This is a warning message' },
  { level: LogLevel.INFO, message: 'This is an info message' },
  { level: LogLevel.DEBUG, message: 'This is a debug message' },
  { level: 'UNKNOWN', message: 'This is an unknown level message' }, // 不会被处理
];

logs.forEach((log) => errorHandler.handle(log));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值