2021年7月22日星期四

js里的职责链模式

职责链模式

职责链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

该模式类似于调用原型方法一样:在该对象没有该方法时向上一个原型上寻找方法;该模式这是该方法无法处理这个请求时,用下一个方法处理该请求,这样形成一个链,每个方法都有可能被调用。

这里用一个表单验证做例子:

btn.addEventListener("click", function (event) { if (input.value.length == 0) {  console.log("这里要输入东西"); } else {  if (Number.isNaN(+input.value)) {   console.log("这里是数字");   if (input.value.length < 3) {    console.log("这里要三个以上数字");   }  } }});

可以看到代码可读性很差,如果用职责链模式来重构:

function checkEmpty() { if (input.value.length == 0) {  console.log("这里要输入东西"); } return "next";}function checkNumber() { if (Number.isNaN(+input.value)) {  console.log("这里是数字"); } return "next";}function checkLength() { if (input.value.length < 3) {  console.log("这里要三个以上数字"); } return "next";}class Chain { constructor(fn) {  this.checkRule = fn;  this.nextRule = null; } addRule(nextRule) {  this.nextRule = nextRule; } check() {  this.checkRule() == "next" ? this.nextRule.check() : null; }}const isEmpty = new Chain(checkEmpty);const isNumber = new Chain(checkNumber);const isLength = new Chain(checkLength);const check = new Chain(() => "next");check.addRule(isEmpty);isEmpty.addRule(isNumber);isNumber.addRule(isLength);isLength.addRule({ check: () => "end" });btn.addEventListener("click", () => { check.check();});

现在代码可读性变强了,但是很明显变得相当庞大,并且每个链上的函数都得返回一个相同的"next",这里用装饰模式稍微修改一下代码,做成链式调用:

function checkEmpty() { if (input.value.length == 0) {  console.log("这里要输入东西"); }}function checkNumber() { if (Number.isNaN(+input.value)) {  console.log("这里是数字"); }}function checkLength() { if (input.value.length < 3) {  console.log("这里要三个以上数字"); }}class Chain { constructor(fn) {  this.checkRule = fn ?? (() => "next");  this.nextRule = null; } addRule(nextRule) {  this.nextRule = new Chain(() => (nextRule(), "next"));  return this.nextRule; } end() {  this.nex......

原文转载:http://www.shaoqun.com/a/892064.html

跨境电商:https://www.ikjzd.com/

prezi:https://www.ikjzd.com/w/1751

走秀网:https://www.ikjzd.com/w/2427

赛兔:https://www.ikjzd.com/w/2375


职责链模式职责链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。该模式类似于调用原型方法一样:在该对象没有该方法时向上一个原型上寻找方法;该模式这是该方法无法处理这个请求时,用下一个方法处理该请求,这样形成一个链,每个方法都有可能被调用。这里用一个表单验证做例子:btn.addEventListener("click",function(ev
usps国际快递查询:https://www.ikjzd.com/w/513
天津的又一特色 - :http://www.30bags.com/a/410185.html
天津第一摩天大楼砸400亿建造,有11项世界纪录,如今却成烂尾楼:http://www.30bags.com/a/223597.html
天津第一座儿童公园:http://www.30bags.com/a/221526.html
天津动物园门票_天津动物园门票价格_天津动物园门票多少钱 :http://www.30bags.com/a/413536.html
宝贝亲亲我的东西大不大 把你的扇贝打开给我好不好:http://lady.shaoqun.com/m/a/247497.html
校花练车时给教练插了 儿媳在公交车让公爹插 女孩张开裙子给男生捅:http://lady.shaoqun.com/m/a/246891.html
他JJ又粗又长的查插我 姐夫,嗯啊,痛,慢点插:http://lady.shaoqun.com/m/a/274839.html
2021粤港澳大湾区车展推荐游玩路线:http://www.30bags.com/a/517352.html
深圳锦绣中华火把节活动攻略:http://www.30bags.com/a/517353.html
深圳锦绣中华彝族火把节什么时候:http://www.30bags.com/a/517354.html
在一段感情中,你能做爱多久?:http://lady.shaoqun.com/a/428386.html

没有评论:

发表评论