设计模式----责任链模式(职责链模式)Chain of Responsibility)

一、定义

职责链模式是一种对象的行为模式。在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

1、为请求创建一个接收此次请求对象的链

2、类型:行为型

二、适用场景

一个请求的处理需要多个对象当中的一个或几个协作处理

三、有点

请求的发送者和接收者(请求的处理)解耦

责任链可以动态的组合

四、缺点

责任链太长或者处理时间过长,影像性能

责任链有可能过多

五、类图:

职责链模式的组成:
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandle)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

六、实例:公司请病假,1天内,项目经理批准;2天内Senior PM批准; 大于两天,医院提供病例、假条
public abstract class LeaveBaseHandler
{
    protected LeaveBaseHandler successor;

public LeaveBaseHandler getSuccessor()
    {
        return successor;
    }

public void setSuccessor(final LeaveBaseHandler successor)
    {
        this.successor = successor;
    }

public abstract void requestLeave(int days);
}

public class OneDayLeaveConcreteHandler extends LeaveBaseHandler
{
    @Override
    public void requestLeave(final int days)
    {
        if (days <= 1)
        {
            System.out.println("approve one day leave");
        }
        else
        {
            super.successor.requestLeave(days);
        }

}

}

public class TwoDaysLeaveConcreteHandler extends LeaveBaseHandler
{
    @Override
    public void requestLeave(final int days)
    {
        if (days > 1 && days <= 2)
        {
            System.out.println("approve 2 days leave");
        }
        else
        {
            super.successor.requestLeave(days);
        }
    }
}

public class MoreThanTwoDaysConcreteHandler extends LeaveBaseHandler
{
    @Override
    public void requestLeave(final int days)
    {
        if (days > 2)
        {
            System.out.println("get the record for leave from hospital");
        }
    }
}

public class Client
{
    private static void requestLeave()
    {
        final LeaveBaseHandler oneDay = new OneDayLeaveConcreteHandler();
        final LeaveBaseHandler twoDays = new TwoDaysLeaveConcreteHandler();
        final LeaveBaseHandler moreThanTwoDays = new MoreThanTwoDaysConcreteHandler();
        oneDay.setSuccessor(twoDays);
        twoDays.setSuccessor(moreThanTwoDays);

oneDay.requestLeave(1);
        oneDay.requestLeave(2);
        oneDay.requestLeave(3);
    }

public static void main(final String[] args)
    {
        requestLeave();
    }
}

结果:
approve one day leave
approve 2 days leave
get the record for leave from hospital

如果职责链结构比较复杂,会产生很多的内存垃圾对象。

七、实例2

课程审核

1、创建批准者类

/**
 * 批准者 2019/1/7.
 */
public abstract class Approver {

    //责任链的核心是包含一个自己。 protected可以让子类获取到它
    protected Approver approver;

    //设置下一个批准者
    public  void setNextApprover(Approver approver){
        this.approver = approver;
    }

    //发布课程
    public abstract void deploy(Course course);
}

  

2、创建ArticleApprover

public class ArticleApprover extends  Approver{
    @Override
    public void deploy(Course course) {
        if(StringUtils.isNotBlank(course.getArticle())){
            System.out.println(course.getName() + "含有Article,批准");
            if(approver != null){
                approver.deploy(course);
            }
        }else{
            System.out.println(course.getName() + "无Article,不批准,流程结束");
            return;
        }

    }
}

 

3、创建VideoApprover  

public class VideoApprover extends  Approver{
    @Override
    public void deploy(Course course) {
        if(StringUtils.isNotBlank(course.getVideo())){
            System.out.println(course.getName() + "含有Video,批准");
            if(approver != null){
                approver.deploy(course);
            }
        }else{
            System.out.println(course.getName() + "无Video,不批准,流程结束");
            return;
        }

    }
}

  

4、创建课程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 + ‘\‘‘ +
                ‘}‘;
    }
}

  

5、创建测试类

public class Test {
    public static void main(String[] args) {
        //审核员审核article
        Approver articleApprover = new ArticleApprover();
        //审核员审核video
        Approver videoApprover = new VideoApprover();

        Course course = new Course();
        course.setName("设计模式");
        course.setArticle("设计模式Article");
        course.setVideo("设计模式Video");

        articleApprover.setNextApprover(videoApprover);

        articleApprover.deploy(course);
    }
}

  

6、输出结果

原文地址:https://www.cnblogs.com/linlf03/p/3093385.html

时间: 2024-10-10 00:46:15

设计模式----责任链模式(职责链模式)Chain of Responsibility)的相关文章

责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 责任链模式中,每个对象通过持有对下家的引用而链接起来,形成一条链条,串联起来多个处理对象. 在责任链模式中,请求在链上进行传递,直到链上的某一个对象决定处理此请求. 发出这个请求的客户端程序并不知道到底是哪一个对象具体的处理了请求 这使得系统可以在不影响客户

atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3. 调用代码 2 4. 责任链链的特性: 2 5. 模式结构 4 6. 职责链模式包含如下角色:Handler,ConcreteHandler: 具体处理者,HandlerChainUtil ,Client 4 7. 设置哈一个handler,,两个法:排序法,指定法 5 1. 指定法 5 2. 排

重温设计模式(三)——职责链模式(chain of responsibility)

一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所以希望各位多多指教. 二. 什么是链 文章伊始,先让我们了解这个最基本的概念,什么是链. 我给链下了这样的定义: 1. 链是一系列节点的集合. 2. 链的各节点可灵活拆分再重组. 三. 何为职责链 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条

设计模式的征途—14.职责链(Chain of Responsibility)模式

相信大家都玩过类似于“斗地主”的纸牌游戏,某人出牌给他的下家,下家看看手中的牌,如果要不起,则将出牌请求转发给他的下家,其下家再进行判断.一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新牌.在这个过程中,纸牌作为一个请求沿着一条链在传递,每一位纸牌的玩家都可以处理该请求.在设计模式中,也有一种专门用于处理这种请求链式的模式,它就是职责链模式. 职责链模式(Chain of Responsibility) 学习难度:★★★☆☆ 使用频率:★★☆☆☆ 一.采购单的分级审批模块设计 需求

设计模式(行为型)之职责链模式(Chain of Responsibility Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之状态模式(State Pattern)>http://blog.csdn.net/yanbober/article/details/45502665 概述 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链

[设计模式]&lt;6&gt;. C++与职责链模式(chain of rsponsibility pattern)

默默地EEer,原文地址: http://www.cnblogs.com/hebaichuanyeah/p/5625233.html 职责链模式指使多个对象多有机会处理请求,避免请求发送者和接受者的耦合关系. 将这些接受处理的对象连成一条链,并沿着该链处理请求. 一个传说中的应用情景: 假如去政府部门办事,遇到了打字员小丽,在打LOL的小张以及主任老李,互相踢皮球推脱. #include <iostream> using namespace std; class Handler { prote

大战设计模式【18】&mdash;&mdash; 职责链模式

职责链模式(Chain of Responsibility) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 避免将请求发送者与接受者耦合在一起,让多个对象都有机会接受请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 二.结构 Handler(抽象处理者):定义了一个处理请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法. Co

设计模式--行为型模式--职责链模式

简单的应用举例: 参考文章: http://blog.csdn.net/jason0539/article/details/45091639 http://www.cnblogs.com/kym/archive/2009/04/06/1430078.html 请假这个事情,相信每个人都不陌生. 在公司里,如果请假时间小于0.5天,那么只需要向项目经理打声招呼就OK了. 如果超过了0.5天,但是还小于2天,那么就要去找人事部处理,当然,这就要扣工资了. 如果超过了2天,你就需要去找总经理了,工资当

设计模式(19)---职责链模式

一.定义 职责链模式:使得多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 解释:简单来说应该是对于一个请求,不同的人根据自己职责范围对它进行处理,同时也因为它一般是从底层向上层传递的请求的,所以将处理该请求的不同的对象比喻成一个链,从相对“低”的地方传递到相对“高”的地方,从而完成请求操作. 二.UML类图及基本代码 基本代码: abstract class Handler { protected H

设计模式 --&gt; (15)职责链模式

职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 示例 考虑员工要求加薪.公司的管理者一共有三级,总经理.总监.经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权 内,那么经理可以直接批准,否则将申请上交给总监.总监的处理方式也一样,总经理可以处理所有请求.这就是典型的职责链模式,请求的处理形成了一条链,直 到有一个对象处理请求. #include <iostre