设计模式_行为型_责任链模式
从击鼓传花谈起
击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,假如花束在某人手中,则该人就得饮酒。
击鼓传花的类图结构如下:

?
如果用一个对象系统描述贾府,那么贾母、贾赦、贾政、贾宝玉和贾环等等就应当分别由一个个具体类代表,而这场击鼓传花游戏的类图,按照责任链模式,应当如下图所示:

?责任链模式的静态类结构可见下图:

?抽象处理者的示意性源代码:
public class Handler { public void handleRequest() { if (successor != null) { successor.handleRequest(); } // Write your code here } public void setSuccessor(Handler successor) { this.successor = successor; } public Handler getSuccessor() { return successor; } private Handler successor; } ?具体处理者的示意性源代码:
public class ConcreteHandler extends Handler { public void handleRequest() { if (getSuccessor() != null) { getSuccessor().handleRequest(); } if (successor != null) { successor.handleRequest(); } // Write your code here } }?客户端的源代码如下:
public class Client { private Handler handler; public static void main(String[] args) { handler = new ConcreteHandler(); //write your code here } } ?纯的与不纯的责任链模式
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,二是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接受;在一个不纯的责任链模式里面,一个请求可以最终不被任何接受端对象所接受。
纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的;但是在实际的系统里,纯的责任链很难找到;如果坚持责任链不纯便不是责任链模式,那么责任链模式