文档章节

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

JackieRiver
 JackieRiver
发布于 2018/08/21 00:09
字数 1022
阅读 86
收藏 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
粉丝 23
博文 64
码字总数 92272
作品 0
广州
程序员
私信 提问
设计模式18——Chain of Responsibility设计模式

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

小米米儿小
2014/01/26
0
0
(目录)设计模式(可复用面向对象软件的基础)

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

chapin
2015/01/13
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
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
Java中的24种设计模式与7大原则

1,创建型模式 一、抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要指定具体类. 二、生成器模式(Builder pattern): 使用生成器模式封装一个...

OrionBox
2012/09/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
0
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
1
0
推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
昨天
3
0
雷军亲自打造的套餐了解下:用多少付多少

12月28日消息,小米科技创始人兼CEO雷军微博表示,小米移动任我行套餐方案,原则上就是明明白白消费,用多少付多少,不用不花钱!上网、电话和短信都是一毛钱,上网0.1元/M,电话0.1元/分钟,...

linuxCool
昨天
6
0
协议简史:如何学习网络协议?

大学时,学到网络协议的7层模型时,老师教了大家一个顺口溜:物数网传会表应。并说这是重点,年年必考,5分的题目摆在这里,你们爱背不背。 考试的时候,果然遇到这个问题,搜索枯肠,只能想...

Java干货分享
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部