JavaScript 设计模式之职责链模式

本文探讨了在编程中如何通过职责链模式将函数职责分解,降低耦合性,以及命令模式如何隐藏具体实现,提供简洁的接口。这两种模式有助于提高代码可维护性和测试性。
摘要由CSDN通过智能技术生成

职责链

在日常开发中,我们一个函数(方法)应该是尽可能的单单只做一件事,比如 一个获取 name 的函数,他就用来返回 name 处理 name相关的数据就好了,这就是职责

function getName(){

    // todo sth.
    return name
}

在写代码过程中,将职责的粒度划分的越小,越容易排查问题,单元测试也更容易

例如

假使我们有以下代码


const sendData = function (data, meth) {
  // todo: 处理请求相关
  // 我们可以在这里处理相关的请求逻辑
  return fetch(`${url}?${data}`, { method: meth })
}

/**
 * 处理数据
 * @param {*} data 需要处理的数据
 */
const dealData = function (data) {
  // 处理数据
  const dataType = Object.prototype.toString.call(data)
  if (dataType === '[object Array]') {
    // 数组
    return createSug(data)
  }
  if (dataType === '[object Object]') {
    // 对象
    let newData = []
    for (let key in data) {
      newData.push( data[key] )
    }
    return createSug([newData])
  }
}

/**
 * 展示到界面
 * @param {*} data 展示的数据
 */
const createSug = function (data) {
  const sugList = document.querySelector('#sug-list')
  sugList.innerHTML = ''
  data.forEach(item => {
    const li = document.createElement('li')
    li.innerText = item
    sugList.appendChild(li)
  })
  return data
}

使用

可以这样使用看看

dealData(["封不平",'易国梓','都史'])

dealData({
  ame: '窝阔台',
  age: 20,
  gender: 'female'
})

只需要做到一个函数只处理与自己相关的事即可,与其他无关

总结

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

命令模式

命令模式我们不需要关注命令后面的函数是如何实现的,逻辑是什么,我们只需要对命令返回的某些命令进行正常的传值即可

例如


const sthCommand = (function () {
  // todo: 一些方法
  const methods = {
    // 展示数据
    show(data) {
      console.log('show=>',data)
      // todo:
    },
    // 隐藏数据
    hide(data) {
      console.log('hide=>',data)
      // todo: 
    }
    ...
  }
  return function exec() { }
})()

我们定义许多的方法,我们只需要暴露一个 exec 的闭包函数出去给外部使用即可

 function exec(msg) {
  if (!msg) return 
  msg.params = Object.prototype.toString.call(msg.params) === '[object Array]' ? msg.params : [msg.params];
  return methods[msg.command].apply(methods, msg.params)
}

使用

sthCommand({
  command: 'show',
  params: ['hello world']
})
sthCommand({
  command: 'hide',
  params: ['hello world']
})

// show=> hello world
// hide=> hello world

总结

命令模式我们不再需要关注每一个命令内部的实现,使用起来简洁明了,在许多的框架中也都有用到

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放逐的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值