设计模式-javascript实现【职责链模式】
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成
一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
1. 实现职责链
// 定义职责链
class Chain {
constructor(fn){
this.fn = fn;
this.successor = null;
}
// 设置下一个节点
setNextSuccessor(successor){
return this.successor = successor;
}
// 传递或者执行请求
passRequest(){
const ret = this.fn.apply(this, arguments);
if(ret === 'nextSuccessor'){
return this.successor && this.successor.passRequest.apply(this.successor, arguments);
}
return ret;
}
// 异步职责链可以直接调用next方法
next(){
return this.successor && this.successor.passRequest.apply(this.successor, arguments);
}
}
// 定义职责链上的节点
const order500 = function(orderType, pay, stock){
if(orderType === 1 && pay === true){
console.log('500元定金预购,得到100元优惠券');
}
else {
return 'nextSuccessor';
}
}
const order200 = function(orderType, pay, stock){
if(orderType === 2 && pay === true){
console.log('200元定金预购,得到50元优惠券');
}
else {
return 'nextSuccessor';
}
}
const orderNormal = function(orderType, pay, stock){
if(stock > 0) {
console.log('普通购买');
}
else {
console.log('手机库存不足');
}
}
// 职责链设置和调用
const chainOrder500 = new Chain(order500);
const chainOrder200 = new Chain(order200);
const chainOrderNormal = new Chain(orderNormal)
chainOrder500.setNextSuccessor(chainOrder200).setNextSuccessor(chainOrderNormal);
chainOrder500.passRequest(3, true, 500);
/** 异步职责调用 **/
const fn1 = new Chain(function(){
console.log(1);
return 'nextSuccessor';
});
const fn2 = new Chain(function(){
console.log(2);
const self = this;
setTimeout(function(){
self.next();
}, 1000);
});
const fn3 = new Chain(function(){
console.log(3);
});
fn1.setNextSuccessor(fn2).setNextSuccessor(fn3);
fn1.passRequest();
2. 用AOP实现职责链
// 定义函数链
Function.prototype.after = function(fn){
const self = this;
return function(){
const ret = self.apply(this, arguments);
if(ret === 'nextSuccessor'){
return fn.apply(this, arguments);
}
return ret;
};
}
// 定义函数节点
const order500 = function(orderType, pay, stock){
if(orderType === 1 && pay === true){
console.log('500元定金预购,得到100元优惠券');
}
else {
return 'nextSuccessor';
}
}
const order200 = function(orderType, pay, stock){
if(orderType === 2 && pay === true){
console.log('200元定金预购,得到50元优惠券');
}
else {
return 'nextSuccessor';
}
}
const orderNormal = function(orderType, pay, stock){
if(stock > 0) {
console.log('普通购买');
}
else {
console.log('手机库存不足');
}
}
const order = order500.after(order200).after(orderNormal);
order(2, true, 500);
标签:
javascript
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性