行为模式---之--责任链模式
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
角色:
1.抽象处理者(Handler):定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定的返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。
2.具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
示例代码:
1 public class ChainTest { 2 private static Handler handler1,handler2; 3 public static void main(String[] args) { 4 handler1 = new ConcreteHandler(); 5 handler2 = new ConcreteHandler(); 6 handler1.setSuccessor(handler2); 7 handler1.handleRequest(); 8 } 9 10 } 11 //抽象处理者 12 abstract class Handler{ 13 protected Handler successor; 14 //调用此处理方法处理请求 15 public abstract void handleRequest(); 16 //赋值方法,调用此方法设定下家 17 public void setSuccessor(Handler successor){ 18 this.successor = successor; 19 } 20 //取值方法 21 public Handler getSuccessor(){ 22 return successor; 23 } 24 } 25 26 //具体处理者 27 class ConcreteHandler extends Handler{ 28 29 @Override 30 public void handleRequest() { 31 if(getSuccessor()!=null){ 32 System.out.println("The request is passed to "+ getSuccessor()); 33 getSuccessor().handleRequest(); 34 }else{ 35 System.out.println("The request is handled here"); 36 } 37 } 38 39 }
纯与不纯责任链模式:
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,二是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。
在一个纯的责任链模式里,一个请求必须被某一个处理者对象所接收;在 一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。
责任链模式减低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。链的拓扑结构可以是单连通的或多连通的,责任链模式并不指定责任链的拓扑结构。但是责任链模式要求在同一个时间里,命令只可以被传给一个下家(或被处理掉),而不可以传给多于一个下家。