天天一个设想形式之义务链形式

作者按:《天天一个设想形式》旨在开端体会设想形式的精华,现在采纳
javascript
python两种言语完成。固然,每种设想形式都有多种完成体式格局,但此小册只纪录最直接了当的完成体式格局 :)

0. 项目地点

1. 什么是“义务链形式”?

义务链形式:多个对象均有时机处置惩罚要求,从而
消除发送者和接受者之间的耦合关联。这些对象连接成为
链式组织,每一个节点转发要求,直到有对象处置惩罚要求为止。

个中心就是:要求者没必要晓得是谁哪一个节点对象处置惩罚的要求。假如当前不符合住手前提,那末把要求转发给下一个节点处置惩罚。

而当需求具有“通报”的性子时(代码中个中一种表现就是:多个if、else if、else if、else嵌套),就能够斟酌将每一个分支拆分红一个节点对象,拼接成为义务链。

2. 长处与价值

  • 长处

    • 能够依据需求更改,恣意向义务链中增加 / 删除节点对象
    • 没有牢固的“最先节点”,能够从恣意节点最先
  • 价值:义务链最大的价值就是每一个节点带来的过剩斲丧。当义务链太长,许多节点只要通报的作用,而不是真正地处置惩罚逻辑。

3. 代码完成

为了轻易演示,模仿罕见的“日记打印”场景。模仿了 3 种级别的日记输出:

  • LogHandler: 一般日记
  • WarnHandler:正告日记
  • ErrorHandler:毛病日记

起首我们会组织“义务链”:LogHandler -> WarnHandler -> ErrorHandlerLogHandler作为链的最先节点。

假如是一般日记,那末就由 LogHandler 处置惩罚,住手流传;假如是 Warn 级别的日记,那末 LogHandler 就会自动向下通报,WarnHandler 接收到而且处置惩罚,住手流传;Error 级别日记同理。

3.1 ES6 完成

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

  setNext(handler) {
    this.next = handler;
  }
}

class LogHandler extends Handler {
  constructor(...props) {
    super(...props);
    this.name = "log";
  }

  handle(level, msg) {
    if (level === this.name) {
      console.log(`LOG: ${msg}`);
      return;
    }
    this.next && this.next.handle(...arguments);
  }
}

class WarnHandler extends Handler {
  constructor(...props) {
    super(...props);
    this.name = "warn";
  }

  handle(level, msg) {
    if (level === this.name) {
      console.log(`WARN: ${msg}`);
      return;
    }
    this.next && this.next.handle(...arguments);
  }
}

class ErrorHandler extends Handler {
  constructor(...props) {
    super(...props);
    this.name = "error";
  }

  handle(level, msg) {
    if (level === this.name) {
      console.log(`ERROR: ${msg}`);
      return;
    }
    this.next && this.next.handle(...arguments);
  }
}

/******************以下是测试代码******************/

let logHandler = new LogHandler();
let warnHandler = new WarnHandler();
let errorHandler = new ErrorHandler();

// 设置下一个处置惩罚的节点
logHandler.setNext(warnHandler);
warnHandler.setNext(errorHandler);

logHandler.handle("error", "Some error occur");

3.2 Python3 完成

class Handler():
    def __init__(self):
        self.next = None

    def set_next(self, handler):
        self.next = handler


class LogHandler(Handler):
    def __init__(self):
        super().__init__()
        self.__name = "log"

    def handle(self, level, msg):
        if level == self.__name:
            print('LOG: ', msg)
            return

        if self.next != None:
            self.next.handle(level, msg)


class WarnHandler(Handler):
    def __init__(self):
        super().__init__()
        self.__name = "warn"

    def handle(self, level, msg):
        if level == self.__name:
            print('WARN: ', msg)
            return

        if self.next != None:
            self.next.handle(level, msg)


class ErrorHandler(Handler):
    def __init__(self):
        super().__init__()
        self.__name = "error"

    def handle(self, level, msg):
        if level == self.__name:
            print('ERROR: ', msg)
            return

        if self.next != None:
            self.next.handle(level, msg)


# 以下是测试代码
log_handler = LogHandler()
warn_handler = WarnHandler()
error_handler = ErrorHandler()

# 设置下一个处置惩罚的节点
log_handler.set_next(warn_handler)
warn_handler.set_next(error_handler)

log_handler.handle("error", "Some error occur")

4. 参考

5. 📚 博客软广 📚

个人手艺博客-godbmw.com 迎接来玩! 每周最少 1 篇原创手艺分享,另有开源教程(webpack、设想形式)、口试刷题(偏前端)、学问整顿(每周细碎),迎接历久关注!本篇博客地点是:《天天一个设想形式之义务链形式》

假如您也想尝试学问整顿 + 搭建功用完美/设想简约/疾速启动的个人博客,请直接戳theme-bmw

    原文作者:心谭
    原文地址: https://segmentfault.com/a/1190000017790787
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞