GOF:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
类图:
PS.Successor是继承者的意思,如果当前的Handler不能处理请求时,就将请求传给Successor。
适用性:
- 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 你想在不明确指定接受者的情况下,向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应被动态指定。
优缺点:
- 降低耦合性。客户无需知道请求具体是被哪个对象处理了,只需要知道把请求发给谁即可。
- 增强了给对象指派职责的灵活性。我们可以在处理请求的类中修改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语句分解,原本会根据请求的类型来进行相关处理,现在将相关处理都封装成类,我们只需要将请求发给最低级的处理类(嘛,也不一定要从最低级的开始),该处理类会判断该请求自己能否处理,如果不能则交给下一级。其实有点像异常的处理。
时间: 2024-10-29 19:06:57