转自:http://alaric.iteye.com/blog/1926447
责任链(Chain of Responsibility)模式:责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系。将这些对象连成一条链,沿着这条链传递该请求,直到有一个对象处理它为止。责任链模式强调的是每一个对象及其对下家的引用来组成一条链,利用这种方式将发送者和接收者解耦,类图如下: 通过上图可以看出责任链模式有两个角色:
抽象处理者(Handler)角色:定义一个请求的接口。如果需要可以定义个一个方法用来设定和返回下家对象的引用。
具体处理者(ConcreteHandler)角色:如果可以处理就处理请求,如果不能处理,就把请求传给下家,让下家处理。也就是说它处理自己能处理的请求且可以访问它的下家。
上述模式的测试代码如下:
Java代码
- package chainOfResp;
- /**
- *
- *作者:alaric
- *时间:2013-8-17上午11:01:58
- *描述:抽象处理角色
- */
- public abstract class Handler {
-
- protected Handler successor;
- /**
- *
- *作者:alaric
- *时间:2013-8-17上午11:04:22
- *描述:处理方法
- */
- public abstract void handlerRequest(String condition);
-
-
- public Handler getSuccessor() {
- return successor;
- }
- public void setSuccessor(Handler successor) {
- this.successor = successor;
- }
-
- }
Java代码
- package chainOfResp;
- /**
- *
- *作者:alaric
- *时间:2013-8-17上午11:25:54
- *描述:具体处理角色
- */
- public class ConcreteHandler1 extends Handler {
-
- @Override
- public void handlerRequest(String condition) {
- // 如果是自己的责任,就自己处理,负责传给下家处理
- if(condition.equals("ConcreteHandler1")){
- System.out.println( "ConcreteHandler1 handled ");
- return ;
- }else{
- System.out.println( "ConcreteHandler1 passed ");
- getSuccessor().handlerRequest(condition);
- }
- }
-
- }
Java代码
- package chainOfResp;
- /**
- *
- *作者:alaric
- *时间:2013-8-17上午11:25:54
- *描述:具体处理角色
- */
- public class ConcreteHandler2 extends Handler {
-
- @Override
- public void handlerRequest(String condition) {
- // 如果是自己的责任,就自己处理,负责传给下家处理
- if(condition.equals("ConcreteHandler2")){
- System.out.println( "ConcreteHandler2 handled ");
- return ;
- }else{
- System.out.println( "ConcreteHandler2 passed ");
- getSuccessor().handlerRequest(condition);
- }
- }
-
- }
Java代码
- package chainOfResp;
- /**
- *
- *作者:alaric
- *时间:2013-8-17上午11:25:54
- *描述:具体处理角色
- */
- public class ConcreteHandlerN extends Handler {
-
- /**
- * 这里假设n是链的最后一个节点必须处理掉
- * 在实际情况下,可能出现环,或者是树形,
- * 这里并不一定是最后一个节点。
- *
- */
- @Override
- public void handlerRequest(String condition) {
-
- System.out.println( "ConcreteHandlerN handled");
-
- }
-
- }
Java代码
- package chainOfResp;
- /**
- *
- *作者:alaric
- *时间:2013-8-17上午10:59:06
- *描述:测试类
- */
- public class Client {
-
- /**
- *作者:alaric
- *时间:2013-8-17上午10:58:58
- *描述:
- */
- public static void main(String[] args) {
-
- Handler handler1 = new ConcreteHandler1();
- Handler handler2 = new ConcreteHandler2();
- Handler handlern = new ConcreteHandlerN();
-
- //链起来
- handler1.setSuccessor(handler2);
- handler2.setSuccessor(handlern);
-
- //假设这个请求是ConcreteHandler2的责任
- handler1.handlerRequest("ConcreteHandler2");
-
-
- }
-
- }
|