English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
一、概述
职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
貌似和数据结构中的链表一样。
但,不要搞混了,职责链可不等于链表哦,因为职责链可以在任何一个节点开始往下查找,而链表,则必须从头结点开始往下查找。
比如,DOM事件机制中的冒泡事件就属于职责链,而捕获事件则属于链表。
二、利用职责链模拟冒泡
假设我们有三个对象:li、ul、div,三者关系图如下:
比如,当我们触发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(); } } };
Cada vez que usamos o construtor CreateDOM para criar um objeto, passamos o objeto relacionado nele (sim, é assim como uma lista de encadeamento).
Depois, quando acionamos um objeto e executamos o método handle, podemos seguir essa corrente.
Mas, atenção, quando o atributo handle de um objeto cobre o handle da corrente do prototype, como continuar para baixo?
Basta usar CreateDOM.prototype.handle.call(this);.
Então, o código para implementar li, ul e div é o seguinte:
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); } };
Isso é tudo o que há no artigo. Espero que ajude no seu aprendizado e que você apoie mais o tutorial Yell.
Declaração: O conteúdo deste artigo é extraído da Internet, pertence ao respectivo detentor dos direitos autorais, é contribuído e carregado voluntariamente pelos usuários da Internet, este site não possui os direitos de propriedade, não foi editado manualmente e não assume nenhuma responsabilidade legal. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Apenas quando confirmado, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)