文档章节

设计模式之五 责任链模式(Chain of Responsibility)

JackieRiver
 JackieRiver
发布于 08/21 00:09
字数 1022
阅读 19
收藏 0

一. 场景

      相信我们都有过这样的经历;

      我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理;

      当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理;

      这时我们又顶着炎热的天气跑到了C部门,被告知这件事情并不是由C处理,要到D部门去... ...

      这就是一个责任链模式,将多个部门组成一条责任链,然后按照在链上的顺序依次找到负责部门来处理问题;

二. 应用

     我们假定有一个数字需要处理;

2.1 定义发生问题的类Trouble

/**
 * Created by Administrator on 2018/8/20.
 *
 * 要处理的问题
 */
@ToString
@Data
@AllArgsConstructor
public class Trouble {

    private Integer number;

}

2.2 定义解决问题的抽象类


/**
 * Created by Administrator on 2018/8/20.
 *
 * 责任链抽象类
 */
public abstract class Support {

    /**
     * 责任链的名字
     */
    private String name;

    /**
     * 责任链的下一个节点
     */
    private Support nextSupport;

    public Support(String name) {
        this.name = name;
    }

    /**
     * 执行责任链的下一个节点
     */
    public Support setNextSupport(Support nextSupport){
        this.nextSupport = nextSupport;
        return nextSupport;
    }

    /**
     * 解决问题的抽象方法,供子类实现
     */
    protected abstract boolean resolve(Trouble trouble);

    /**
     * 解决问题的步骤
     */
    public final void support(Trouble trouble){
        if (resolve(trouble)){
            haveDone(trouble);
        } else if (this.nextSupport != null){
            this.nextSupport.support(trouble);
        } else {
            failDone(trouble);
        }
    }

    /**
     * 解决问题后执行的方法
     */
    protected void haveDone(Trouble trouble){
        System.out.println(String.format("%s have been resolved by %s .", trouble, this));
    }

    /**
     * 未能解决问题执行的方法
     */
    protected void failDone(Trouble trouble){
        System.out.println(String.format("%s can't be resolved .", trouble));
    }
}

2.3 定义处理类实现类

2.3.1 不处理任何数字的类

/**
 * Created by Administrator on 2018/8/20.
 *
 * 该类什么也不处理
 */

public class NoSupport extends Support {

    public NoSupport(String name) {
        super(name);
    }

    @Override
    protected boolean resolve(Trouble trouble) {
        return false;
    }
}

2.3.2 只处理小于给定数字的类


/**
 * Created by Administrator on 2018/8/20.
 *
 * 只处理小于定义的数字
 */
public class LessSupport extends Support{

    private Integer lessNumber;

    public LessSupport(String name, Integer lessNumber) {
        super(name);
        this.lessNumber = lessNumber;
    }


    @Override
    protected boolean resolve(Trouble trouble) {
        return trouble.getNumber() < this.lessNumber;
    }
}

2.3.3 只处理指定数字

/**
 * Created by Administrator on 2018/8/20.
 *
 * 只能处理特定的数字
 */
public class SpecialSupport extends Support {

    /**
     * 指定只能处理的数字
     */
    private Integer specialNumber;

    public SpecialSupport(String name, Integer specialNumber) {
        super(name);
        this.specialNumber = specialNumber;
    }

    @Override
    protected boolean resolve(Trouble trouble) {
        return trouble.getNumber().equals(this.specialNumber);
    }
}

2.3.4 只处理奇数

/**
 * Created by Administrator on 2018/8/20.
 * <p>
 * 处理奇数
 */
public class OddSupport extends Support {


    public OddSupport(String name) {
        super(name);
    }

    @Override
    protected boolean resolve(Trouble trouble) {
        return trouble.getNumber() % 2 == 0 ;
    }
}

至此,责任链节点定义完毕

2.4 运行

2.4.1 main

/**
 * Created by Administrator on 2018/8/20.
 */
public class Main {

    public static void main(String[] args) {
        //首先定义节点
        Support noSupport = new NoSupport("A");
        Support lessSupport = new LessSupport("B",10);
        Support oddSuuport = new OddSupport("C");
        Support specialSuuport = new SpecialSupport("D",30);
        noSupport.setNextSupport(lessSupport).setNextSupport(oddSuuport).setNextSupport(specialSuuport);

        //执行
        noSupport.support(new Trouble(5));
    }
}

2.4.2 运行结果

Trouble(number=5) have been resolved by com.chainofresponsibility.LessSupport@270421f5 .

至此,责任链模式演示完毕;

3.模式分析

3.1 角色解析

在责任链模式中,一共登场了3个角色:

  • 处理者接口
  • 具体的处理者实现类
  • 请求者

我们在编写责任链模式时要注意者三个角色;

3.2 模式对比

       责任链模式使得每个处理类只关注自己要处理的场景,处理工作更加专注;如果不符合,则抛到下一个处理节点,我们不必指定专门的处理类,更加弱化了处理的角色;

        在这里我想到了策略模式,我们往往需要利用工厂来根据传入的参数指定特定的处理类来处理,而责任链模式实际上恰恰的弱化了这一环节,我们不必知道交给链条的问题到底是哪一个节点来处理;

4. 动态改变责任链

 

...待续...

© 著作权归作者所有

共有 人打赏支持
JackieRiver
粉丝 19
博文 64
码字总数 88659
作品 0
广州
程序员
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
设计模式18——Chain of Responsibility设计模式

Chain of Responsibility(CoR)责任链设计模式是用一系列请求处理器试图处理一个请求,这些请求处理器之间是一个松散耦合,唯一的共同点是在他们之间传递请求。例如客户端发送一个请求,请求处...

小米米儿小
2014/01/26
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
Tomcat 系统架构与设计模式_ 设计模式分析

门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中等都用到...

lvzjane
2014/11/03
0
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
2
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
113
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
4
0
我为什么用GO语言来做区块链?

Go语言现在常常被用来做去中心化系统(decentralised system)。其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地。 我们在决定做Karachain的时候,考量(b...

HiBlock
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部