责任链模式-Chain of Responsibility
名称:
责任链模式 (Chain of Responsibility Pattern)-对象行为型模式
问题:
The Chain of Responsibility pattern establishes a chain within a system, so that a message can either be handled at the level where it is first received, or be directed to an object that can handle it.
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
适用性:
-有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
-你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
-可处理一个请求的对象集合应被动态指定。
协作:
当客户提交一个请求时。请求沿链传递直至有一个ConcreteHandler对象负责处理它。
优点和缺点:
1、降低耦合度。该模式使得一个对象无需知道是其他哪一个对象处理其请求。
2、增强了给对象指派职责的灵活性。当在对象中分配职责时,职责链给你更多的灵活性。
3、不保证被接受
解决方案:
1、 模式的参与者
1、Handler
-定义一个处理请求的接口。
-(可选)实现后继链。
2、ConcreteHandler
-处理它所负责的请求。
-可访问它的后继者。
-如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
3、Client
-向链上的具体处理者对象提交请求。
2.实现方式
abstract class Handler { private Handler next; public void setNext(Handler next) { this.next=next; } public Handler getNext() { return next; } public abstract void handleRequest(String request); }
class ConcreteHandler1 extends Handler { public void handleRequest(String request) { if(request.equals("Handler1")) { System.out.println("process on Handler1!"); } else { if(getNext()!=null) { getNext().handleRequest(request); } else { System.out.println("no processor"); } } } }
class ConcreteHandler2 extends Handler { public void handleRequest(String request) { if(request.equals("Handler2")) { System.out.println("process on Handler2!"); } else { if(getNext()!=null) { getNext().handleRequest(request); } else { System.out.println("no processor"); } } } }
public class ChainOfResponsibilityPattern { public static void main(String[] args) { Handler handler1=new ConcreteHandler1(); Handler handler2=new ConcreteHandler2(); handler1.setNext(handler2); handler1.handleRequest("two"); } }
参考资料
《设计模式:可复用面向对象软件的基础》