本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-12-15
职责链模式(Chain of Responsibility):解决请求的发送者与请求的接受者之间的耦合,通过职责链上的多个对象对分解请求流程,实现请求在多个对象之间的传递,直到最后一个对象完成请求的处理。
将需求颗粒化、模块化,分解成相互独立的模块需求,通过这些对象的分工协作,每个对象只做自己分内的事,无关的事情传到下一个对象中去做,直到需求完成。
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
// 请求模块
var sendData = function(data, dealType, dom) {
var xhr = new XMLHttpRequest();
var url = 'getData.php?mod=userInfo';
xhr.onload = function (event) {
if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
dealData(xhr.responseText, dealType, dom)
} else {
// 请求失败
}
}
for (var i in data) {
url += '&' + i + '=' + data[i]
}
xhr.open("get", url, true);
xhr.send(null);
}
// 响应数据适配模块
var dealData = function(data, dealType, dom) {
switch(dealType) {
// 输入框提示功能
case 'sug':
if (Object.prototype.toString.call(data) === '[object Array]') {
return createSug(data, dom)
} else if (Object.prototype.toString.call(data) === '[object Object]') {
return createSug(Object.values(data), dom)
}
return createSug([data], dom);
// 校验组件
case 'validate':
return createValidateResult(data, dom);
}
}
// 创建组件模块
var createSug = function(data, dom) {
var html = '';
for (let i = 0, l = data.length; i < l; i++) {
html += '<li>' + data[i] + '</li>';
}
dom.parentNode.getElementsByTagName('ul')[0].innerHTML = html;
}
var createValidateResult = function(data, dom) {
dom.parentNode.getElementsByTagName('span')[0].innerHTML = data;
}
职责链模式定义了请求的传递方向,通过多个对象对请求的传递,实现一个复杂的逻辑操作。因此职责链模式将负责的需求颗粒化逐一实现每个对象分内的需求,并将请求顺序地传递。对于职责链上的每一个对象来说,它都可能是请求的发起者也可能是请求的接收者。通过这样的方式不仅仅简化原对象的复杂度,而且解决原请求的发起者与接收者之间的耦合。
对于职责链上的每一个对象不一定都能参与请求的传递,有时会造成一丝资源的浪费,并且多个对象参与请求的传递,这在代码调试时也增加了成本。