设计模式——责任链模式

2020-05-01  本文已影响0人  小波同学

什么是责任链模式

客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象。这样就实现了请求者和接受者之间的解耦,并且在客户端可以实现动态的组合职责链。使编程更有灵活性。

责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。其过程实际上是一个递归调用。

注意:责任链模式也叫职责链模式。

在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。

要点主要是:

责任链模式的结构

责任链模式的结构图 责任链模式的结构图 责任链

责任链模式涉及到的角色如下所示:

责任链模式的优缺点

优点:

缺点:

责任链模式的使用场景

责任链模式的实现

定义课程实体类Course
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 + '\'' +
                '}';
    }
}
抽象处理者(Handler)角色
public abstract class Handler {

    protected Handler handler;

    public void setNextHandler(Handler handler){
        this.handler = handler;
    }

    public abstract void deploy(Course course);
}
具体处理者(ConcreteHandler)角色
public class ArticleHandler extends Handler {
    @Override
    public void deploy(Course course) {
        if(!StringUtils.isEmpty(course.getArticle())){
            System.out.println(course.getName()+"课程包含article,批准");
            if(handler != null){
                handler.deploy(course);
            }
        }else {
            System.out.println(course.getName()+"课程不包含article,不批准,流程结束");
            return;
        }
    }
}

public class VideoHandler extends Handler {
    @Override
    public void deploy(Course course) {
        if(!StringUtils.isEmpty(course.getVideo())){
            System.out.println(course.getName()+"课程包含video,批准");
            if(handler != null){
                handler.deploy(course);
            }
        }else {
            System.out.println(course.getName()+"课程不包含video,不批准,流程结束");
            return;
        }
    }
}
客户端代码
public class Test {

    public static void main(String[] args) {
        Handler articleHandler = new ArticleHandler();
        Handler videoHandler = new VideoHandler();

        Course course = new Course();
        course.setName("Pulsar精讲");
        course.setArticle("Pulsar的博客");
        course.setVideo("Pulsar的视频");

        articleHandler.setNextHandler(videoHandler);
        articleHandler.deploy(course);
    }
}

责任链模式的应用场景

前边已经讲述了关于责任链模式的结构与特点,下面介绍其应用场景,责任链模式通常在以下几种情况使用。

责任链模式的扩展

职责链模式存在以下两种情况。

总结

对于责任链中的一个处理者对象,有两个行为。一是处理请求,二是将请求传递到下一节点,不允许某个处理者对象在处理了请求后又将请求传送给上一个节点的情况。

对于一条责任链来说,一个请求最终只有两种情况。一是被某个处理对象所处理,另一个是所有对象均未对其处理,对于前一种情况我们称为纯的责任链模式,后一种为不纯的责任链。实际中大多为不纯的责任链。

参考:
http://c.biancheng.net/view/1383.html

https://www.cnblogs.com/xuwendong/p/9814425.html

上一篇下一篇

猜你喜欢

热点阅读