职责链模式
职责链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
该模式类似于调用原型方法一样:在该对象没有该方法时向上一个原型上寻找方法;该模式这是该方法无法处理这个请求时,用下一个方法处理该请求,这样形成一个链,每个方法都有可能被调用。
这里用一个表单验证做例子:
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
没有评论:
发表评论