js职责链模式

请求,一系列请求处理对象组成的链表,请求在链表中传递的过程中,选择合适的处理对象去处理请求

var Chain = function(fn) {
    // 职责处理函数
    this.fn = fn
    // 下一个职责对象节点
    this.successor = null
}

Chain.prototype = {
    setNextSuccessor: function(successor){
        return this.successor = successor
    },
    passRequest: function() {
        var ret = this.fn.apply(this, arguments)
        if (ret === 'nextSuccessor') {
            return this.successor && this.successor.passRequest.apply(this.successor, arguments)
        }
        return ret
    },
    next:function() {
        return this.successor && this.successor.passRequest.apply(this.successor, arguments)
    }
}

// 创建职责链 处理请求节点
var chain0 = new Chain(function(type) {
    if (type === 0) {
        console.log('deal request in chain:' + type)
    } else {
        return 'nextSuccessor'
    }
})
var chain1 = new Chain(function(type) {
    if (type === 1) {
        console.log('deal request in chain:' + type)
    } else {
        return 'nextSuccessor'
    }
})
var chain2 = new Chain(function(type) {
    if (type === 2) {
        console.log('deal request in chain:' + type)
    } else {
        return 'nextSuccessor'
    }
})
// 连接 节点
chain0.setNextSuccessor(chain1).setNextSuccessor(chain2)
// 发出请求
chain0.passRequest(1)  // 输出: deal request in chain:1

上面是请求在职责链间传递是同步的,如果需要异步,可以手动传递请求给职责链下一个节点


var chain3 = new Chain(function(type) {
    console.log(3)
    if (type === 3) {
        console.log('deal request in chain:' + type)
    } else {
        console.log('deal request async')
        var self = this
        setTimeout(function(){
            self.next(type)
        }, 2000)
    }
})
var chain4 = new Chain(function(type) {
    console.log(4)
    if (type === 4) {
        console.log('deal request in chain:' + type)
    } else {
        return 'nextSuccessor'
    }
})
// 连接 节点
chain0.setNextSuccessor(chain1).setNextSuccessor(chain2).setNextSuccessor(chain3).setNextSuccessor(chain4)

// 发出请求
chain0.passRequest(4) //deal request in chain:4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值