首页 技术 正文
技术 2022年11月17日
0 收藏 748 点赞 2,363 浏览 1231 个字
一、概述

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

貌似和数据结构中的链表一样。

但,不要搞混了,职责链可不等于链表哦,因为职责链可以在任何一个节点开始往下查找,而链表,则必须从头结点开始往下查找。

比如,DOM事件机制中的冒泡事件就属于职责链,而捕获事件则属于链表。

该篇博客原文地址:http://www.cnblogs.com/giggle/p/5878239.html

二、利用职责链模拟冒泡

假设我们有三个对象:li、ul、div,三者关系图如下:

JavaScript之职责链模式

比如,当我们触发li对象时,如果li没有阻止冒泡,那么将会传递给ul对象,到了ul,如果没有阻止冒泡,则会传递给div对象(假设这里div为根节点)。同理,ul、div。

看到这儿,很清楚适合用职责链模式,编写这样的需求。

但,怎么使用JavaScript实现职责链模式呢?

如下,我们可以通过原型链的方式构建基本架构:

function CreateDOM(obj){
this.next = obj || null;
};
CreateDOM.prototype = {
handle: function(){
if(this.next){
this.next.handle();
}
}
};

每当我们利用CreateDOM构造函数,创建一个对象时,就将与之关联的对象传递进去(嗯,这样很链表)。

然后,当我们触发某个对象,执行handle方法时,就可以沿着这条链,走下去了。

但,需注意,当某个对象的handle属性覆盖了原型链中的handle时,怎么继续往下传呢?

利用CreateDOM.prototype.handle.call(this);就好了。

So,实现li、ul和div代码如下:

var li = null,
ul = null,
div = null;
div = new CreateDOM();
div.handle = function(stopBubble){
console.log('DIV');
if(stopBubble){
return;
}else{
CreateDOM.prototype.handle.call(this);
}
};
ul = new CreateDOM(div);
ul.handle = function(stopBubble){
console.log('UL');
if(stopBubble){
return;
}else{
CreateDOM.prototype.handle.call(this);
}
};
li = new CreateDOM(ul);
li.handle = function(stopBubble){
console.log('LI');
if(stopBubble){
return;
}else{
CreateDOM.prototype.handle.call(this);
}
};

over~~

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