首页 技术 正文
技术 2022年11月19日
0 收藏 399 点赞 3,569 浏览 3302 个字

* 可拆分的责任链节点

// 可拆分的责任链节点
// Chain.prototype.setNextSuccessor 指定在链条中的下一个节点
// Chain.prototype.passRequest 传递请求给某个节点function Chain(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 === "nextSuccessor") {
return this.successor
&& this.successor.passRequest.apply(this.successor, arguments);
}
return ret;
}// 3个订单函数
// @orderType:
// 1=>500元定金
// 2=>200元定金
// 3=>普通购买用户
// @pay: 用户是否已经支付定金 (下定金未支付?)
// @stock: SKU 库存数量
var order500 = function(orderType, pay, stock) {
if (orderType === 1 && pay===true) {
console.log("500元定金订购,得到100元优惠券。");
} else {
// 把请求往后面传递
return "nextSuccessor";
}
}
var order200 = function(orderType, pay, stock) {
if (orderType === 2 && pay===true) {
console.log("200元定金订购,得到50元优惠券。");
} else {
return "nextSuccessor";
}
}
var orderNormal = function(orderType, pay, stock) {
if (stock > 0) {
console.log("普通购买, 无优惠券。");
} else {
console.log("手机库存不足。");
}
}// 把3个订单函数分别包装成责任链的节点
var chainOrder500 = new Chain(order500);
var chainOrder200 = new Chain(order200);
var chainOrderNormal = new Chain(orderNormal);// 指定节点在责任链中的顺序
chainOrder500.setNextSuccessor(chainOrder200);
chainOrder200.setNextSuccessor(chainOrderNormal);// test: 把请求传递给第1个节点
chainOrder500.passRequest(1, true, 300);
chainOrder500.passRequest(2, true, 299);
chainOrder500.passRequest(3, true, 298);
chainOrder500.passRequest(1, false, 0);// 后期新增优惠规则 300元定金订购
var order300 = function(orderType, pay, stock) {
if (orderType === 4 && pay===true) {
console.log("300元定金订购,得到60元优惠券。");
} else {
return "nextSuccessor";
}
}
var chainOrder300 = new Chain(order300);
chainOrder500.setNextSuccessor(chainOrder300);
chainOrder300.setNextSuccessor(chainOrder200);chainOrder500.passRequest(4, true, 297);

  output:

500元定金订购,得到100元优惠券。
200元定金订购,得到50元优惠券。
普通购买, 无优惠券。
手机库存不足。
300元定金订购,得到60元优惠券。

* 异步的责任链

function Chain(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 === "nextSuccessor") {
return this.successor
&& this.successor.passRequest.apply(this.successor, arguments);
}
return ret;
}Chain.prototype.next = function() {
return this.successor &&
this.successor.passRequest.apply(this.successor, arguments);
}var fn1 = new Chain(function() {
console.log(1);
return 'nextSuccessor';
});var fn2 = new Chain(function() {
console.log(2);
var self = this;
setTimeout(function() {
self.next();
}, 1000);
// return 'nextSuccessor';
});var fn3 = new Chain(function() {
console.log(3);
});fn1.setNextSuccessor(fn2).setNextSuccessor(fn3);
fn1.passRequest();

  Run:

* 使用aop实现责任链

// 3个订单函数
// @orderType:
// 1=>500元定金
// 2=>200元定金
// 3=>普通购买用户
// @pay: 用户是否已经支付定金 (下定金未支付?)
// @stock: SKU 库存数量
var order500 = function(orderType, pay, stock) {
if (orderType === 1 && pay===true) {
console.log("500元定金订购,得到100元优惠券。");
} else {
// 把请求往后面传递
return "nextSuccessor";
}
}
var order200 = function(orderType, pay, stock) {
if (orderType === 2 && pay===true) {
console.log("200元定金订购,得到50元优惠券。");
} else {
return "nextSuccessor";
}
}
var orderNormal = function(orderType, pay, stock) {
if (stock > 0) {
console.log("普通购买, 无优惠券。");
} else {
console.log("手机库存不足。");
}
}// 使用aop实现责任链
Function.prototype.after = function(fn) {
var self = this;
return function() {
var ret = self.apply(this, arguments);
if (ret === 'nextSuccessor') {
return fn.apply(this, arguments);
}
return ret;
}
}
var order = order500.after(order200).after(orderNormal);order(1, true, 500);
order(2, true, 500);
order(1, false, 500);

  

Run:

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,031
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,520
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,368
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,148
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,781
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,860