在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
通常来说,一个纯粹的责任链是先传给第一个处理,如果处理过了,这个请求处理就此结束,如果没有处理,再传给下一个处理者。这样使很多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。低耦合可以动态的添加删除处理者或重新指派处理者的职责,可以动态改变处理者之间的先后顺序。
责任链模式涉及到两种角色:
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
IHandler处理者角色接口:
public interface IHandler { public void operator(); }AbsHandler抽象处理者角色:
public class AbsHandler { private IHandler handler; public IHandler getHandler() { return handler; } public void setHandler(IHandler handler) { this.handler = handler; } }MyHandler具体处理者角色:
public class MyHandler extends AbsHandler implements IHandler { private String name; public MyHandler(String name) { this.name = name; } @Override public void operator() { System.out.println(name + " do something!"); if (getHandler() != null) { getHandler().operator(); }else{ System.out.println(name + " final do!"); } } }(注)本例中的处理条件是:只要有下家对象则交由下家处理。
执行过程:
MyHandler h1 = new MyHandler("h1"); MyHandler h2 = new MyHandler("h2"); MyHandler h3 = new MyHandler("h3"); h2.setHandler(h3); h1.setHandler(h2); h1.operator();执行结果:
h1 do something! h2 do something! h3 do something! h3 final do!