16-JavaScript设计模式——责任链模式

职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。


先看以下场景:

// 有个任务,[小A, 小B, 小C, 小D]中的一个人可以做,但不知道谁能做

// 任务的类
var Assign = function(task){// task 任务类型
	this.task = task;
};

// 接收任务的类
var WorkFlow = function(assign){
	this.assign = assign;
};
WorkFlow.prototype = {
	constructor : WorkFlow,
	// 分析当前的任务到底谁能去执行
	filterHandler : function(es){
		for (var i = 0, len = es.length; i < len; i++) {
			if (this.assign.task === es[i].cando) return es[i].todo();
		}
		return;
	}
};

// 处理者
var Executor = function(name, cando){
	this.name = name;// 接受者的姓名
	this.cando = cando;// 擅长的任务
};

Executor.prototype = {
	constructor : Executor,
	todo : function(){
		document.write(this.name + '开发:' + this.cando);
	}
};

// 实例化4个处理对象
var e1 = new Executor('小A', 'javascript编程');
var e2 = new Executor('小B', 'css编程');
var e3 = new Executor('小C', 'java编程');
var e4 = new Executor('小D', 'sql编程');

// 实例化任务对象
var assign = new Assign('sql编程');

// 实例化处理任务的类
var wf = new WorkFlow(assign);
wf.filterHandler([e1, e2, e3, e4]);// 小D开发:sql编程


用责任链改进

// 责任链作用:解除任务的 发送者 和 接受者 之间的耦合
// 还是这个任务,[小A, 小B, 小C, 小D]中的一个人可以做,但不知道谁能做

// 任务的类
var Assign = function(task){// task 任务类型
	this.task = task;
};

// 接收任务的类
var WorkFlow = function(assign){
	this.assign = assign;
};
WorkFlow.prototype = {
	constructor : WorkFlow,
	// 当过滤函数只接收一个 接受者 对象(链中的第一个接受者)
	filterHandler : function(execute){
		// 如果该接受者擅长此任务,则该接受者就去执行
		if (this.assign.task === execute.cando) {
			return execute.todo();
		}else{
			// 递归
			arguments.callee.call(this, execute.successor);
		}
	}
};

// 处理者
var Executor = function(name, cando){
	this.name = name;// 接受者的姓名
	this.cando = cando;// 擅长的任务
	this.successor = null;// 保留当前接受者的下一个对象的引用
};

Executor.prototype = {
	constructor : Executor,
	todo : function(){
		document.write(this.name + '开发:' + this.cando);
	},
	// 关键:设置责任链的配置函数
	setSuccessor : function(successor){
		this.successor = successor;
		return successor;
	}
};

// 实例化4个处理对象
var e1 = new Executor('小A', 'javascript编程');
var e2 = new Executor('小B', 'css编程');
var e3 = new Executor('小C', 'java编程');
var e4 = new Executor('小D', 'sql编程');

// 关键;为每个接受者 添加 下一个接受者的 引用
e1.setSuccessor(e2).setSuccessor(e3).setSuccessor(e4);

// 实例化任务对象
var assign = new Assign('java编程');

// 实例化处理任务的类
var wf = new WorkFlow(assign);
wf.filterHandler(e1);// 小C开发:java编程



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值