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

本文主要参考链接:https://blog.csdn.net/taozi8023/article/details/51451142

文章目录

  • 职责链模式简介
  • 使用示例
  • 总结
  • 扩展联想学习

职责链模式简介

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

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

类图:
职责链模式简介及使用示例_第1张图片

使用示例

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   处理了请求

总结

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

扩展联想学习

其他设计模式

你可能感兴趣的:(设计模式)