设计模式18——Chain of Responsibility设计模式

来源:互联网 发布:淘宝联盟怎么打不开 编辑:程序博客网 时间:2024/06/07 02:50

Chain of Responsibility(CoR)责任链设计模式是用一系列请求处理器试图处理一个请求,这些请求处理器之间是一个松耦合,唯一的共同点是在他们之间传递请求。例如客户端发送一个请求,请求处理器A先处理,如果A没有处理或者无法处理,就将请求传递给请求处理器B,如果B没有处理或者无法处理,将将请求传递到请求处理器C去处理,所有这些请求处理器构成一条请求处理责任链。Chain of Responsibility责任链设计模式的结构如下:

Chain of Responsibility责任链设计模式的时序图如下:

一个处理数字、字母和特殊符合的例子演示Chain of Responsibility,代码如下:

//抽象请求处理器

abstract class Handler{

    private Handler sccessor;

    public Handler(Handler successor){

         this.successor = sucessor;

    }

   public Handler getSuccessor(){

        return successor;

   }

   public void handRequest(Request request);

}

//Request请求类

class Request{

    private String type;

    public Request(String type){

        this.type = type;

    }

  public String getType(){

        return type;

  }

}

//数字请求处理器

class NumberHandler extends Handler{

     public NumberHander(){

      }

     public NumberHandler(Handler successor){

         super(successor);

     }

   public void handRequest(Request request){

          if(request.getType().equals("Number")){

                 System.out.println("Number has been handled");

          }

    //传递到下一个请求处理器处理

    else{

         getSuccessor().handRequest(request);

    }

}

}

//字母请求处理器

   class CharacterHandler extends Handler{

        public CharacterHandler(){

       }

       public CharacterHandler(Handler successor){

           super(successor);

       }

      public void handRequest(Request request){

             if(request.getType().equals("Character")){

                 System.out.println("Character has been handled");

              }

           //传递到下一个请求处理器处理

          else{

             getSuccessor().handRequest(request);

          }

    }

}

//特殊符号请求处理器

class SymbolHandler extends Handler{

        public SymbolHandler(){

         }

        public SymbolHandler(Handler successor){

          super(successor);

        }

    public void handRequest(Request request){

           if(request.getType().equals("Symbol")){

               System.out.println("Symbol has been handled");

           }

         //传递到下一个请求处理器处理

         else{

            getSuccessor().handRequest(request);

         }

    }

}

public class Application{

       public static void main(String[] args){

             Handler numberHandler = new NumberHandler();

             Handler characterHandler = new CharacterHandler();

             Handler symbolHandler = new SymbolHandler();

             numberHandler.setSuccessor(characterHandler);

             characterHandler.setSuccessor(symbolHandler);

             Request request1 = new Request("Number");

             Request request2 = new Request("Character");

             Request request3 = new Request("Symbol");

             numberHandler.handRequest(request1);

             numberHandler.handRequest(request2);

             numberHandler.handRequest(request3);

      }

}

java中Chain of Responsibility的两个应用例子:

(1)java的异常处理机制,当出现中发生异常时,try-catch会比较所捕捉的异常是否符合异常类型,如果符合就执行所设定的处理,如果都没有比对到适当的异常,剧会将异常丢出try-catch区块之外。

(2)Struts1.x中的filter过滤器链,Struts2.x中拦截器链等等,将HTTP请求处理中的字符编码转换,加密/解密等常用功能分别作为一个个的请求处理器,接收到客户端请求时对其进行处理,同时在客户端返回服务端响应时也使用这些处理器进行处理。

0 0