作者按:《天天一个设想形式》旨在开端体会设想形式的精华,现在采纳
javascript
和
python
两种言语完成。固然,每种设想形式都有多种完成体式格局,但此小册只纪录最直接了当的完成体式格局 :)
0. 项目地点
1. 什么是“义务链形式”?
义务链形式:多个对象均有时机处置惩罚要求,从而
消除发送者和接受者之间的耦合关联。这些对象连接成为
链式组织,每一个节点转发要求,直到有对象处置惩罚要求为止。
个中心就是:要求者没必要晓得是谁哪一个节点对象处置惩罚的要求。假如当前不符合住手前提,那末把要求转发给下一个节点处置惩罚。
而当需求具有“通报”的性子时(代码中个中一种表现就是:多个if、else if、else if、else
嵌套),就能够斟酌将每一个分支拆分红一个节点对象,拼接成为义务链。
2. 长处与价值
长处
- 能够依据需求更改,恣意向义务链中增加 / 删除节点对象
- 没有牢固的“最先节点”,能够从恣意节点最先
- 价值:义务链最大的价值就是每一个节点带来的过剩斲丧。当义务链太长,许多节点只要通报的作用,而不是真正地处置惩罚逻辑。
3. 代码完成
为了轻易演示,模仿罕见的“日记打印”场景。模仿了 3 种级别的日记输出:
-
LogHandler
: 一般日记 -
WarnHandler
:正告日记 -
ErrorHandler
:毛病日记
起首我们会组织“义务链”:LogHandler
-> WarnHandler
-> ErrorHandler
。LogHandler
作为链的最先节点。
假如是一般日记,那末就由 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. 参考
- 《JavaScript 设想形式和开辟实践》
- javascript 之 义务链形式
- 职责链形式
5. 📚 博客软广 📚
个人手艺博客-godbmw.com 迎接来玩! 每周最少 1 篇原创手艺分享,另有开源教程(webpack、设想形式)、口试刷题(偏前端)、学问整顿(每周细碎),迎接历久关注!本篇博客地点是:《天天一个设想形式之义务链形式》。
假如您也想尝试学问整顿 + 搭建功用完美/设想简约/疾速启动的个人博客,请直接戳theme-bmw