职责链模式

本文共--字 阅读约--分钟 | 浏览: -- 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;
}

职责链模式定义了请求的传递方向,通过多个对象对请求的传递,实现一个复杂的逻辑操作。因此职责链模式将负责的需求颗粒化逐一实现每个对象分内的需求,并将请求顺序地传递。对于职责链上的每一个对象来说,它都可能是请求的发起者也可能是请求的接收者。通过这样的方式不仅仅简化原对象的复杂度,而且解决原请求的发起者与接收者之间的耦合。

对于职责链上的每一个对象不一定都能参与请求的传递,有时会造成一丝资源的浪费,并且多个对象参与请求的传递,这在代码调试时也增加了成本。