设计模式-职责链模式

简介

职责链模式进行顺序请求,使每个对象都有机会处理请求,避免请求者与接受者之间的耦合。沿着链条传递请求,直到有个对象能够处理它为止。

开发中的职责链模式

先考虑如下代码

function chain(item){
	if(item===1){
    	console.log("执行方法1");
    }else if(item===2){
    	console.log("不满足条件1,执行方法2");
    }else{
    	console.log("不满足条件1、2,执行方法3");
    }
}

上述代码想描述的是如果接受者1不满足者将请求交给接收者2,接受者2如果不满足者将请求交给接受者3,如果加上业务功能,那么后期的维护势必会存在非常大的问题。现在使用职责链模式重构如下:


function fn1(item){
  	if(item===1){
      console.log("执行方法1");
    }else{
    	fn2(item);
    }
}
function fn2(item){
  	if(item===2){
      console.log("执行方法2");
    }else{
    	fn3(item);
    }
}
function fn3(item){
   console.log("执行方法1");
}

上述代码将大函数抽离为小的函数,但是违反了开放-封闭原则,fn1只能将请求交给fn2,fn2只能将请求交给fn3。

更加灵活的职责链


function fn1(item){
  	if(item===1){
      console.log("执行方法1");
    }else{
    	return 'next'
    }
}
function fn2(item){
  	if(item===2){
      console.log("执行方法2");
    }else{
    	return 'next'
    }
}
function fn3(item){
   console.log("执行方法1");
}

function chain(fn){
	this.next = null;
  	this.fn = fn;
}
chain.prototype.setNext = function(fn){
	this.next = fn;
}
chain.prototype.pass = function(){
	
	const ret = this.fn.apply(this,arguments);
  	if(ret==='next'){
    	return this.next&& this.next.pass.apply(this.next,arguments);
    }
  	return ret
}
const chain1 = new chain(fn1);
const chain2 = new chain(fn2);
const chain3 = new chain(fn3);
chain1.setNext(chain2);
chain2.setNext(chain3);

// 然后将请求交给第一个节点
chain1.pass(2);

上述职责链可以自定义下一个节点,更加的灵活。

用AOP实现职责链模式


function fn1(item){
  	if(item===1){
      console.log("执行方法1");
    }else{
    	return 'next'
    }
}
function fn2(item){
  	if(item===2){
      console.log("执行方法2");
    }else{
    	return 'next'
    }
}
function fn3(item){
   console.log("执行方法3");
}

Function.prototype.after = function(next){
	const self = this;
	return function(){
		const ret = self.apply(this,arguments);
		if(ret==='next'){
			return next.apply(null,arguments);
		}
		return ret	
	}
}
const chain = fn1.after(fn2).after(fn3);
// 然后将请求交给第一个节点
chain(3);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值