Js职责链模式

时间: 2019-04-15阅读: 185标签: 模式
定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

也就是说,请求以后,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者。提交请求的对象并不明确知道哪一个对象将会处理它——也就是该请求有一个隐式的接受者(implicit receiver)。根据运行时刻,任一候选者都可以响应相应的请求,候选者的数目是任意的,你可以在运行时刻决定哪些候选者参与到链中

还不明白?ok, 来个生活小实例, 早高峰挤公交车,往往挤上去却看不到售票员,我们常常通过他人之手将票钱传递给售票员,这种关系就能看做为职责链,我们的票钱通过多人之手最终递交到售票员手中


代码场景: 

假设我们正在开发一个电商网站,某一个商品正在进行预定活动,活动规则如下

500 元定金会收到200 优惠劵
200 元定金会收到100 优惠劵
没有预定的用户只能普通购买
假设我们后端会返回如下字段

orderType [1,2,3] 分别为500,200,普通购买


常规实现:

const order = function(orderType){
  if(orderType===1){
    // 假设我们有其它需求
    if(....){
      .....
    }
    return console.log(500元定金用户)
  }
  if(orderType===2){
    // 假设我们有其它需求
    if(....){
      .....
    }
    return console.log(200元定金用户)
  }
  if(orderType===3){
    // 假设我们有其它需求
    if(....){
      .....
    }
    return console.log(用户普通购买)
  }
}
order(1) // 500元定金用户

虽然我们得到了意料中的运行结果,但这并不是一段优秀的代码,order函数会随着业务的变更经常修改

下面我们用职责链模式进行改写

const Chain = function(fn){
  this.fn = fn;
  this.successor = null;
}
Chain.prototype.setNextSuccessor = function(successor){ 指定在链中的下一个节点
  return this.successor = successor;
}
Chain.prototype.passRequest = function(){  //传递请求给某一下节点
  var ret = this.fn.apply(this,arguments);
  if(ret === false){  // 如果ret 为false 代表链条还得继续往下走
    return this.successor && this.successor.passRequest.apply(this.successor,arguments)
  }
}
// 包装成职责链的节点
var chainOrder500 = new Chain(order500);
var chainOrder200 = new Chain(order200);
// 然后再指定节点在链中的顺序
chainOrder500.setNextSuccessor(chainOrder200)
// 最后把请求传递给第一个节点
chainOrder500.passRequest(1)  // 500元定金用户


用AOP(Aspect Oriented Programming )实现职责链

用AOP实现职责链又简单又巧妙,但这种函数叠加在一起的方式,同时也叠加了函数的作用域,如果链条太长也会对性能造成影响

Function.prototype.after(fn){
  var _this = this;
  return function(){
    var ret = _this.apply(this,arguments);
    if(ret === false){
      return fn.apply(this.arguments);
    }
    return ret
  }
}
var order = order500.after(order200).after(orderNormal);
order(2) // 200定金用户


总结

职责链模式可以很好的帮助我们管理代码,降低发起请求的对象跟接收请求对象的耦合,职责链中的节点顺序是可变化的,我们可以在运行中决定链中包含哪些节点


前后端合作新模式

singsong:该模式主要对传统多页面应用构建的改进。关于 SPA(Single Page Application,单页应用程序)可以参考 SRR(Server-Side Render,服务端渲染)。在那个前端角色比较弱化的年代,页面主要以静态页面为主。

Js命令模式

命令模式:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式由三种角色构成:发布者、接收者、命令对象

js迭代器模式

迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。简单理解(白话理解):统一 “集合” 型数据结构的遍历接口,实现可循环遍历获取集合中各数据项

js严格模式(use strict)

“use strict\\\"是ECMAScript 5引入的一条指令。指令不是语句(但非常接近于语句)。“usestrict\\\"指令和普通的语句之间有两个重要的区别:

Js设计模式总汇

在程序设计中有很多实用的设计模式,而其中大部分语言的实现都是基于“类”。在JavaScript中并没有类这种概念,面向对象编程不是基于类,而是基于原型去面向对象编程,JS中的函数属于一等对象

几种常见的js设计模式

所谓单例模式即为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。所谓代理模式就是:我们不方便直接访问某个对象时,可以为对象创建一个占位符(代理),以便控制对它的访问,我们实际上访问的是代理对象。

从ES5 到 TypeScript单例模式

单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型 (Creational) 模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类

JavaScript 发布-订阅模式

发布-订阅模式,看似陌生,其实不然。工作中经常会用到,例如 Node.js EventEmitter 中的 on 和 emit 方法;Vue 中的 $on 和 $emit 方法。他们都使用了发布订阅模式,让开发变得更加高效方便

JS设计模式之Mixin(混入)模式

Mixin模式就是一些提供能够被一个或者一组子类简单继承功能的类,意在重用其功能。在面向对象的语言中,我们会通过接口继承的方式来实现功能的复用。

如何在代码中应用设计模式

因为我们的项目的需求是永远在变的,为了应对这种变化,使得我们的代码能够轻易的实现解耦和拓展。如果能够保证代码一次写好以后都不会再改变了,那可以想怎么写怎么写了。

fly63.com版权所有,内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权,请与小编联系!情况属实本人将予以删除!

广告赞助文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全