责任链模式

责任链模式简述(Chain of Responsibility)

定义

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将整个对象连成一条链,并沿着这条链传递请求,直到有一个对象处理他为止。

特点

  • 链上的每个对象都有机会处理请求
  • 链上的每一个对象,都持有下一个要处理对象的引用
  • 链上的某个对象无法处理当前请求,那么他会把相同的请求传递给下一个对象

用一张图表示以下使用了责任链模式之后的架构:

graph LR 请求发送者-->请求处理器1 请求处理器1-->请求处理器2 请求处理器2-->请求处理者

也就是说责任链模式满足了请求发送者和请求处理者之间的松耦合,抽象非核心的部分,以链式调用的方式对请求对象进行处理。

使用场景

为完成同一请求,如果存在多个处理器以及不知道请求处理器的个数,或者请求处理器可动态配置的情况下,可以考虑使用责任链模式。

对应的代码实现

  1. 定义业务执行接口
public interface Handler {
    void entry(String req,String resp);
    //责任链逻辑
    void fireEntry(String req,String resp);

}
  1. 定义链表元素,其中包含责任链执行逻辑
/**
 * @author caoqianqian
 * @Description:链表元素,包含责任链的执行逻辑
 */
public abstract  class AbstractLinkedProcessHandler implements Handler {

    private AbstractLinkedProcessHandler next = null;//默认指向null

    public AbstractLinkedProcessHandler getNext() {
        return next;
    }

    public void setNext(AbstractLinkedProcessHandler next){
        this.next = next;
    }

    //责任链的执行逻辑
    public void fireEntry(String req, String resp) {
        if(next != null){//判断是否到达end
            next.entry(req, resp);
        }

    }
}
  1. 定义几个链表元素的实现

先刷牙

public class BrushTeeth extends AbstractLinkedProcessHandler {

    @Override
    public void entry(String req, String resp) {

        System.out.println("刷牙");
        fireEntry(req, resp);
    }
}

再洗脸

public class WashFace extends AbstractLinkedProcessHandler {

    @Override
    public void entry(String req, String resp) {

        System.out.println("洗脸");
        fireEntry(req, resp);
    }
}

再是睡觉

public class Sleep extends AbstractLinkedProcessHandler {

    @Override
    public void entry(String req, String resp) {

        System.out.println("睡觉");
        fireEntry(req, resp);
    }
}
  1. 定义链表插入方法,以抽象类实现,同时继承链表元素的抽象类,目的是在未来的实现中,定义责任链功能调用逻辑
/**
 * @author caoqianqian
 * @Description:定义链表结构的头部插入和尾部插入
 */
public abstract class ProcessHandlerChain extends AbstractLinkedProcessHandler{
    public abstract void addFirst(AbstractLinkedProcessHandler processHandler);
    public abstract void addEnd(AbstractLinkedProcessHandler processHandler);

}
  1. 定义链表的生成逻辑、责任链调用逻辑入口
/**
 * @author caoqianqian
 * @Description:定义链表的生成逻辑  责任链调用逻辑入口
 */
public class DefaultProcessHandlerChain extends ProcessHandlerChain {

   private AbstractLinkedProcessHandler first = new AbstractLinkedProcessHandler() {
        @Override
        public void entry(String req, String resp) {
            super.fireEntry(req, resp);
        }
    };

    private AbstractLinkedProcessHandler end = first;

    @Override
    public void addFirst(AbstractLinkedProcessHandler processHandler) {

        processHandler.setNext(first.getNext());
        first.setNext(processHandler);

        if(end == first){
            end = processHandler;
        }
    }

    @Override
    public void addEnd(AbstractLinkedProcessHandler processHandler) {

        end.setNext(processHandler);
        end = processHandler;

    }

    //责任链调用逻辑入口
    @Override
    public void entry(String req, String resp) {
        first.entry(req, resp);//指向AbstractLinkedProcessHandler的实现
    }
}

  1. 写测试类
public class ChainTest {
    public static void main(String[] args) {
        ProcessHandlerChain chain = new DefaultProcessHandlerChain();
        
        //责任链顺序先刷牙再洗脸最后睡觉
        chain.addEnd(new BrushTeeth());
        chain.addEnd(new WashFace());
        chain.addEnd(new Sleep());

        chain.entry("request","response");
    }
}
  1. 测试结果如下
刷牙
洗脸
睡觉

Process finished with exit code 0

好了,责任链模式暂时就先介绍到这里了,有问题欢迎在评论区留言呐。

posted @ 2021-02-28 17:48  是倩倩不是欠欠  阅读(74)  评论(0编辑  收藏  举报