纯的责任链模式
责任链模式是一种对象的行为模式。
在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,知道链上某一个对象决定处理这个请求。发出请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态重新组织链和分配责任。
抽象处理者
package com.javapatterns.chainofresp;
public abstract class Handler {
/**
* 处理方法,调用此方法处理请求
*/
protected Handler successor;
public abstract void handleRequest();
/**
* 取值方法
* @return Handler
*/
public Handler getSuccessor() {
return successor;
}
/**
* 赋值方法,调用此方法设定下家
*/
public void setSuccessor(Handler successor) {
this.successor = successor;
}
}
下面是具体的处理者。显然,逻辑非常简单,如果一个具体处理者有下家,就将请求传递给下家;如果没有就处理请求
package com.javapatterns.chainofresp;
public class ConcteteHandler extends Handler{
@Override
public void handleRequest() {
if(getSuccessor() != null){
System.out.println("请求传递给:"+getSuccessor().getClass().getName());
getSuccessor().handleRequest();
}else{
System.out.println("请求就在这里执行。");
}
}
}
在大多数情况下,这么简单的处理逻辑是没有实际用途的。真实的处理逻辑是与所研究的系统的商业逻辑密切相关的,这里使用最简化的商业逻辑,有助于将精力集中到如何将模式应用到设计中去。
package com.javapatterns.chainofresp;
public class Client {
private static Handler handler1,handler2;
public static void main(String[] args) {
handler1 = new ConcteteHandler();
handler2 = new ConcteteHandler();
handler1.setSuccessor(handler2);
handler1.handleRequest();
}
}
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一个是承担责任,一个是把责任推给下家。不允许出现某一个具体的处理者对象在承担了一部分责任后又把责任向下传递的情况。
在一个纯的责任链模式里面,一个请求必须被某一个具体的处理者对象所接收;在一个不纯的责任联里面,一个请求可以最终不被任何接受端对象接收。
#####Internet Explorer的事件模型
Internet Explorer的“Event Bubbling”,即事件漂浮机制就是责任链模式。在DOM里面,每一个HTML标识符都是一个DOM对象,而每一个DOM对象都可以产生事先定义好的几个事件中的一个(或几个)。这样一个事件会首先发生在事件所属的对象上,然后向上传播,传到此对象所属的容器对象上。
比如
<html>
<head>
<title>事件漂浮</title>
</head>
<body onclick="alert('mybody');">
<form action = "#" onclick = "alert('myform');">
<input type = "button" value = "测试Event Bubbling" onclick = "alert('mybutton');">
</form>
</body>
</html>