设计模式之职责链模式

概念

   职责链模式就是使多个对象都有机会处理请求,从而避免请求发送者和请求处理者之间的耦合。将这多个对象按着需求组合成一条链,使请求在这条链上进行传递,知道有一个对象处理了请求。

优点

  1.客户提交的请求会沿着我们根据需求设置的链一直传递,直到有一个对象处理了它,并且我们可以根据需要随后的增加或者而修改链上的对象,而不影响每个对象本身的使用。

  2.请求发送者和请求接受者之间没有耦合,互相都没有对方的信息,且链中的对象本身也不清楚链的结构

  3.简化了的对象之间的相互连接,每个对象最多只保持一个后继者的引用,不用保持所有后继者的引用

注意:1.我们设置的链一定要保证最终这个请求可以被处理 2.需要在每个对象中做出判断,判断什么条件下我可以处理或者什么条件下交给继任者(当然要判断时候有继任者)

使用场景

   一个请求可能被传递给多个对象,直到某个对象处理完成结束,但是客户并不知道请求会被那个对象处理。

代码示例

//定义一个处理请求的接口
public
abstract class Handler { /** * 持有后继者的引用对象 */ protected Handler successor; /** * 处理请求的抽象方法 虽然这个示意方法是没有传入参数的 * 但实际是可以传入参数的,根据具体需要来选择是否传递参数 */ public abstract void handleRequest(); /** * 取值方法 */ public Handler getSuccessor() { return successor; } /** * 赋值方法,设置后继的责任对象 */ public void setSuccessor(Handler successor) { this.successor = successor; } }

定义若干个具体处理者类

public class ConcreteHandler1 extends Handler {
     /**
      * 处理方法,调用此方法处理请求
     */
     @Override
     public void handleRequest() {
         /**
          * 判断是否有后继的责任对象
         * 如果有,就转发请求给后继的责任对象
         * 如果没有,则处理请求
         */
         if(什么条件下能处理这个请求){           
        System.out.println("处理请求");
         }else if(successor!=null){
        System.out.println("放过请求");
             successor.handleRequest(); 
        } 
}
}

public class ConcreteHandler2 extends Handler {
     /**
      * 处理方法,调用此方法处理请求
     */
     @Override
     public void handleRequest() {
         /**
          * 判断是否有后继的责任对象
         * 如果有,就转发请求给后继的责任对象
         * 如果没有,则处理请求
         */
         if(什么条件下能处理这个请求){           

        System.out.println("处理请求");

         }else if(successor!=null){

        System.out.println("放过请求");
             successor.handleRequest(); 
        } 
}
}
......

 客户端代码,向链上的具体处理者对象提交请求

public class Client {

    public static void main(String[] args) {
         //组装责任链
        Handler handler1 = new ConcreteHandler1();
         Handler handler2 = new ConcreteHandler2();
         handler1.setSuccessor(handler2);
         //提交请求
        handler1.handleRequest();
     }
}
原文地址:https://www.cnblogs.com/htyj/p/7326053.html