标签:
GOF:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
类图:
PS.Successor是继承者的意思,如果当前的Handler不能处理请求时,就将请求传给Successor。
适用性:
优缺点:
模板代码(参考《大话设计模式》):
public class 职责链模式 { public static void main(String[] args) { Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2); h2.SetSuccessor(h3); int[] request = {5, 15, 25, 35}; for(int i : request) h1.HandleRequest(i); } } class Handler { protected Handler successor; public void SetSuccessor(Handler successor) { this.successor = successor; } public void HandleRequest(int request) {} } class ConcreteHandler1 extends Handler { public void HandleRequest(int request) { if(request >= 0 && request < 10) { System.out.println("ConcreteHandler1 handle request " + request); } else { if (successor != null) { successor.HandleRequest(request); } else { System.out.println("Request " + request + " is unhandled"); } } } } class ConcreteHandler2 extends Handler { public void HandleRequest(int request) { if(request >= 10 && request < 20) { System.out.println("ConcreteHandler2 handle request " + request); } else { if (successor != null) { successor.HandleRequest(request); } else { System.out.println("Request " + request + " is unhandled"); } } } } class ConcreteHandler3 extends Handler { public void HandleRequest(int request) { if(request >= 20 && request < 30) { System.out.println("ConcreteHandler3 handle request " + request); } else { if (successor != null) { successor.HandleRequest(request); } else { System.out.println("Request " + request + " is unhandled"); } } } }
例子:向老师请假时,如果请假日太多,需要上交给年级主任,如果请更多,需要上交给学校。
小结:职责链可以将原本需要长长的if-else if或switch-case语句分解,原本会根据请求的类型来进行相关处理,现在将相关处理都封装成类,我们只需要将请求发给最低级的处理类(嘛,也不一定要从最低级的开始),该处理类会判断该请求自己能否处理,如果不能则交给下一级。其实有点像异常的处理。
标签:
原文地址:http://www.cnblogs.com/programmer-kaima/p/4432961.html