职责链模式简介及使用示例

职责链模式简介

功能:处理链式传递的请求 使用场景:

  1. 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定,客户端只需将请求提交到链上,而无须关心请求的处理对象是谁以及它是如何处理的。
  2. 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  3. 可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求,还可以改变链中处理者之间的先后次序。

类图:

使用示例

public abstract class Handler {
          
   
    private Handler successor;

    public Handler getSuccessor() {
          
   
        return successor;
    }

    public void setSuccessor(Handler successor) {
          
   
        this.successor = successor;
    }

    public abstract void handlerRequest(int request);
}
public class ConcreteHandler1 extends Handler {
          
   
    @Override
    public void handlerRequest(int request) {
          
   
        if(request<10){
          
   
            System.out.println("ConcreteHandler1   处理了请求");
        }else{
          
   
            this.getSuccessor().handlerRequest(request);
        }
    }
}
public class ConcreteHandler2 extends Handler {
          
   
    @Override
    public void handlerRequest(int request) {
          
   
        if(10<= request && request <20){
          
   
            System.out.println("ConcreteHandler2   处理了请求");
        }else{
          
   
            this.getSuccessor().handlerRequest(request);
        }
    }
}

客户端

public class Client {
          
   
    public static void main(String[] args) {
          
   
        Handler concreteHandler1 = new ConcreteHandler1();
        Handler concreteHandler2 = new ConcreteHandler2();

        concreteHandler1.setSuccessor(concreteHandler2);
        concreteHandler2.setSuccessor(new DefaultHandler());

        int[] request = new int[]{
          
   1,20,11};
        for (int i : request){
          
   
            concreteHandler1.handlerRequest(i);
        }
        System.out.println("===========");
        for (int i : request){
          
   
            concreteHandler2.handlerRequest(i);
        }
    }
}

运行结果:

ConcreteHandler1   处理了请求
执行默认处理
ConcreteHandler2   处理了请求
===========
执行默认处理
执行默认处理
ConcreteHandler2   处理了请求

总结

优点:客户端无需知道具体由谁来处理请求,而且可以指定职责链的顺序。当需要添加新的任务处理者时无需修改原有代码,直接新增类即可。 缺点:当职责链较长时会产生大量的无用类对象。

扩展联想学习

经验分享 程序员 微信小程序 职场和发展