JAVA设计模式之Chain-of-Responsiblility模式

    技术2022-05-14  0

    当一个请求可以被多个对象处理,同时又无法确定到底有谁来处理该请求,这时,我们就需要让该请求在这些对象之间一个个的接力,如果当前对象可以处理请求则处理它,否则,传递给下一个对象处理。这就是责任链模式的思想。责任链模式的组件结构图如下:

    可以看出,每个可能处理请求的对象实现同一个接口,同时,每个对象中维护下一个可能处理的对象,这样,就形成了一条责任链。

     

    其中handle(IRequest request)方法的逻辑大致如下:

     

    if(可以处理?){

         处理之;

    }else{

         //交付下一个处理

         nextHandler.handle(request);

    }

     

    这样,就完成了责任链的模式。且这是纯的责任链模式,请求必须被一个对象处理,而且某个对象处理请求时,就不再往下传递请求了。

     

    而现实中,纯的责任链模式并不多见,往往看到的都是不纯的责任链模式。但是,不管怎样,领悟思想,完成“降低耦合,代码重用”的设计目标就行。类似武学中融会贯通,达到无招胜有招的境界。

     

    通过上面我们看到,责任链模式中的handle(IRequest)的逻辑比较固定,我们结合模板方法的模式,来重构一下这个责任链模式:

    如下图:

    我们将原来的IHandler改成了一个抽象类,其中,handle方法的逻辑固定了,子类只需要实现父类的handleRequest方法即可。

    handle(IRequest request)逻辑如下:

    if(!handleRequest(request)){

          nextHandler.handle(request);

    }

     

    你可能会对这个判断条件感到奇怪,看看hanleRequest(IRequest request)的逻辑:

     

    if(该对象可以处理请求){

         //Do SomeThing!

     

          return true;

    }else{

          return false;

    }

     

    呵呵,看到了么?如果该对象可以处理返回真,这样handle()方法就不会将request向下传递了。

     

    这里只是通过这个例子再复习一下模板方法模式,呵呵,真正使用的时候,再做权衡吧!

     

     

     

     


    最新回复(0)