责任链模式(Chain of Responsibility Pattern)

概念:

  • 为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
  • 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

代码实现:

目录结构:


具体代码:

接口:
package service;

/**
 * @author SHshuo
 * @data 2021/11/1--18:47
 */
public interface Handler {

    default void execute(ChainHandler handler){
//        调用自己的方法
        handlerproceed();
//        循环回来调用ChainHandler链表的方法
        handler.proceed();
    }

    void handlerproceed();
}

接口的具体实现类HandlerASubject、HandlerBSubject、HandlerCSubject
package service.Impl;

import service.Handler;

/**
 * @author SHshuo
 * @data 2021/11/1--18:47
 */
public class HanderASubject implements Handler {

    @Override
    public void handlerproceed() {
        System.out.println("HanderASubject");
    }
}

实现链式的类:用index定义为游标、标记链表的位置
package service;

import java.util.List;

/**
 * @author SHshuo
 * @data 2021/11/1--18:49
 * 链
 */
public class ChainHandler {

    private List<Handler> handlers;

//    定义游标
    private int index = 0;

    public ChainHandler(List<Handler> handlers){
        this.handlers = handlers;
    }

    public void proceed(){
        if(index >= handlers.size()){
            return;
        }
//        调用Handler的方法、循环起来了
        handlers.get(index++).execute(this);
    }
}

Client调用、将对象存放在链表内
package controller;

import service.ChainHandler;
import service.Handler;
import service.Impl.HanderASubject;
import service.Impl.HanderBSubject;
import service.Impl.HanderCSubject;

import java.util.Arrays;
import java.util.List;

/**
 * @author SHshuo
 * @data 2021/11/1--18:46
 * 责任链模式
 */
public class ClientController {
    public static void main(String[] args) {
        List<Handler> handlers = Arrays.asList(
                new HanderASubject(),
                new HanderBSubject(),
                new HanderCSubject()
        );

        ChainHandler chainHandler = new ChainHandler(handlers);
        chainHandler.proceed();
    }
}


UML类图



补充:

spring使用ReflectiveMethodInvocation.java实现责任链模式,从而实现链式调用。



hshuo的面试之路 文章被收录于专栏

作者目标是找到一份Java后端方向的工作 此专栏用来记录从Bilibili、书本、其他优质博客上面学习的内容 用于巩固、总结内容 主要包含Docker、Dubbo、Java基础、JUC、Maven、MySQL、Redis、SpringBoot、SpringCloud、数据结构、杂文、算法、计算机网络、操作系统、设计模式等相关内容

全部评论

相关推荐

牛客464620405号:随便投,随便找,中国经过40多年的改革开放,人才缺口和职位空缺是巨大的,中国现在属于遍地黄金的年代,属于90后和00大机遇的时代
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务