首页 > 其他分享 >责任链模式

责任链模式

时间:2024-01-30 10:35:59浏览次数:26  
标签:String void Approver 模式 责任 course 设计模式 public

比如一个web请求,有一堆的过滤器需要处理(或不处理)这个请求,而这一堆接收此次请求的过滤器对象形成一条调用链,即为责任链模式

  • 定义:为请求创建一个接收此次请求对象的链
  • 类型:行为型
  • 适用场景:一个请求的处理需要多个对象当中的一个或几个协作处理
  • 优点:
    • 请求的发送者和接收者(请求的处理)解耦
    • 责任链可以动态组合
  • 缺点:
    • 责任链太长或者处理时间过长,影响性能
    • 责任链有可能过多
  • 相关设计模式
    • 责任链模式和状态模式:责任链模式当中各个对象并不指定下一个处理的对象者是谁,只有在客户端来设定链条中的顺序以及元素,直到被某个元素处理,或者整个链条结束,状态模式是让每个状态模式知道自己下一个处理的对象是谁,也就是说在编译时就设定好了,这个是他俩最大的区别。

Coding

public class Course {
    private String name;
    private String article;
    private String video;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getArticle() {
        return article;
    }

    public void setArticle(String article) {
        this.article = article;
    }

    public String getVideo() {
        return video;
    }

    public void setVideo(String video) {
        this.video = video;
    }

    @Override
    public String toString() {
        return "Course{" +
                "name='" + name + '\'' +
                ", article='" + article + '\'' +
                ", video='" + video + '\'' +
                '}';
    }
}
public abstract class Approver {

    protected Approver approver;

    public void setNextApprover(Approver approver) {
        this.approver = approver;
    }

    public abstract void deploy(Course course);
}
public class ArticleApprover extends Approver {
    @Override
    public void deploy(Course course) {
        if (course.getArticle() != null) {
            System.out.println(course.getName() + "含有手记,批准");
            if (approver != null) {
                approver.deploy(course);
            }
        } else {
            System.out.println(course.getName() + "不含有手记,不批准,流程结束");
        }
    }
}
public class VideoApprover extends Approver {
    @Override
    public void deploy(Course course) {
        if (course.getVideo() != null) {
            System.out.println(course.getName() + "含有视频,批准");
            if (approver != null) {
                approver.deploy(course);
            }
        } else {
            System.out.println(course.getName() + "不含有视频,不批准,流程结束");
        }
    }
}

 

测试

public class Test {
    public static void main(String[] args) {
        Approver articleApprover = new ArticleApprover();
        Approver videoApprover = new VideoApprover();

        Course course = new Course();
        course.setName("Java设计模式");
        course.setArticle("Java设计模式的手记");
        course.setVideo("Java设计模式的视频");

        articleApprover.setNextApprover(videoApprover);
        articleApprover.deploy(course);
    }
}
=======输出======
Java设计模式含有手记,批准
Java设计模式含有视频,批准
// 将 course.setVideo("Java设计模式的视频"); 注释后,打印结果:
Java设计模式含有手记,批准
Java设计模式不含有视频,不批准,流程结束

 

UML

IMG_256

说明:其实类图也很简单,两个 Approver 类继承了其抽象类,Course 是课程主题,最重要的方法就是抽象类 Approver,责任链的核心就是 Approver 类里面包含一个自己同样类型的对象,一般设为 protected,用于子类继承。

源码中的应用

  • javax.servlet.Filter:重点看它的doFilter方法,看看它有个传参FilterChain,随便找一个它下面的实现类MockFilterChain,可以看到它的doFilter方法里面调用了下一个Filter的doFilter方法。

  

public interface Filter {
    void init(FilterConfig var1) throws ServletException;

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    void destroy();
}
public interface FilterChain {
    void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;
}
public class MockFilterChain implements FilterChain {
    private final List<Filter> filters;
    ...
    public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
        Assert.notNull(request, "Request must not be null");
        Assert.notNull(response, "Response must not be null");
        if (this.request != null) {
            throw new IllegalStateException("This FilterChain has already been called!");
        } else {
            if (this.iterator == null) {
                this.iterator = this.filters.iterator();
            }

            if (this.iterator.hasNext()) {
                Filter nextFilter = (Filter)this.iterator.next();
                nextFilter.doFilter(request, response, this);
            }

            this.request = request;
            this.response = response;
        }
    }
    ...
}
  • 在 SpringSecurity 中所有的过滤器形成的调用链就是用的是责任链模式

标签:String,void,Approver,模式,责任,course,设计模式,public
From: https://www.cnblogs.com/wangzhilei-src/p/17996548

相关文章

  • vmware nat模式详解
    vmwarenat模式主机和虚拟机是怎么联系,怎么上网的?关于natnat主要解决虚拟机上外网问题,虚拟机通过nat服务将内网地址和主机的wan口地址进行转换当虚拟机需要上网的时候,nat就会将数据包nat转换,然后从主机的wan口出去,和vm8虚拟网卡无光,关闭vm8虚拟机还是可以上网,只是无法进行内网......
  • C语言设计模式精要
    在C语言中,设计模式是一种常见的方法,它可以帮助我们更好地设计和实现软件系统。设计模式是一种面向对象的设计模式,它可以帮助我们更好地组织和管理代码,提高代码的可读性和可维护性。在C语言中,设计模式主要包括以下几种:单例模式、工厂模式、观察者模式、策略模式、装饰模式等。单......
  • 10种常见的软件架构模式
    你是否想知道企业大规模系统是如何设计的?在软件开发开始之前,我们必须选择一个合适的架构,能提供所需的功能和质量特性。因此,在将架构应用到我们的设计之前,我们应该了解各种不同架构的特点。什么是架构模式?根据维基百科:架构模式是在软件架构上针对特定上下文件解决常见问题的通......
  • 设计模式之访问者模式
    1.定义将算法与其所作用的对象隔离2.口语化表述访问者模式其实就是将具体算法与作用对象分离举个例子,现在需要使用手机打电话,人已经具备了,就差个手机不同的手机有不同的操作方式,所以需要人根据具体手机来操作这就类似于访问者模式,将具体怎么打电话的操作交与人(访问者)来实......
  • 单例模式
    单例模式一、什么是设计模式解决问题的模板,在代码编写的过程中,前辈们会遇到很多问题并尝试解决,长久以来就形成了一套相对规范的解决方法而单例方法就是其中一种使用较多的设计模式二、为什么要使用单例方法(设计模式)设计模式可以帮助开发人员编写高质量、可重用和易于维护......
  • 设计模式(二十三)访问者
    一、定义表示一个作用于某对象结构中的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式二、描述访问者模式是一种较为复杂的行为型模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通......
  • 通达信【金钻天启2210】幅图选股公式 全新思路的超短线操作实战模式指标,成熟实战的思
    原公式某地售价1500元哦,完全加密,股海网和谐源码文件分享本指标一个幅图信号公式,一个选股公式全新思路的超短线操作实战模式指标,本指标是一款以低吸判断最近洗盘结束后,捕捉强势龙头信号介入点提示,自动过滤近期市场弱势股与不活跃股;成熟实战的思路策略设计,快速提升选股能力;贴近......
  • 设计模式:策略模式/状态模式
    设计模式是通用的、可复用的代码设计方案,也可以说是针对某类问题的解决方案,因此,掌握好设计模式,可以帮助我们编写更健壮的代码。wiki中将设计模式分为四类,分别是:创建模式(creationalpatterns)结构模式(structuralpatterns)行为模式(behavioralpatterns)并发模式(concurrencypatt......
  • 用Java语言实现一个观察者模式
    观察者模式(也被称为发布/订阅模式),提供了避免组件之间紧密耦合的另一种方法,它将观察者和被观察的对象分开。在该模式中,一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者收到消......
  • 命令行模式
    定义:将“请求”封装成对象,以便使用不同的请求补充解释:解决了应用程序中对象的职责以及他们之间的通信方式,使发送者和接收者完全解耦,发送者和接收者之间没有没有直接关系,下命令的对象只知道如何发送请求,不知道如何完成请求类型:行为型适用场景:请求调用者和请求接收者需要解耦,......