责任链模式-Chain of Responsibility, 例1

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

Trouble类

本类是:待责任链来处理的问题Trouble类.

本例子较简单, Trouble只有一个int型作为待处理的编号.

public class Trouble {
private int number; public Trouble(int number) {
this.number = number;
} public int getNumber() {
return number;
} public String toString() {
return "[Trouble " + number + "]";
}
}

Support抽象类

Support类是责任链中的节点抽象出来的统一定义.

public abstract class Support {
private String name;
private Support next; public Support(String name) {
this.name = name;
} public Support setNext(Support next) {
this.next = next;
return next;
} protected abstract boolean solve(Trouble trouble); protected void done(Trouble trouble) { // 解决
System.out.println(trouble + " is resolved by " + this + ".");
} protected void fail(Trouble trouble) { // 未解决
System.out.println(trouble + " cannot be resolved.");
} public void execute(Trouble trouble) {
if (solve(trouble)) {
done(trouble);
} else if (next != null) {
next.execute(trouble);
} else {
fail(trouble);
}
} public String toString() {
return "[" + name + "]";
}
}

ZeroSupport类

本类专门用于处理trouble编号为0的

/**
* 本类专门用于处理trouble为0的情况
*/
public class ZeroSupport extends Support {
public ZeroSupport(String name) {
super(name);
} @Override
protected boolean solve(Trouble trouble) {
if (trouble.getNumber() == 0) {
return true;
} else {
return false;
}
}
}

LimitSupport类

只要Trouble的编号小于本类的成员变量limit的值, 那么LimitSupport类的实例就可以处理这个Trouble

/**
* 本类专门用于处理trouble值小于limit的情况
*/
public class LimitSupport extends Support {
private int limit; public LimitSupport(String name, int limit) {
super(name);
this.limit = limit;
} @Override
protected boolean solve(Trouble trouble) {
if (trouble.getNumber() < limit) {
return true;
} else {
return false;
}
}
}

OddSupport类

只要Trouble的编号是奇数, 那么OddSupport类的实例就可以处理这个Trouble.

/**
* 本类专门用于处理trouble为奇数的情况
*/
public class OddSupport extends Support { public OddSupport(String name) {
super(name);
} @Override
protected boolean solve(Trouble trouble) {
if (trouble.getNumber() % 2 == 1) {
return true;
} else {
return false;
}
}
}

Main

用于测试运行

public class Main {
public static void main(String[] args) {
Support charlie = new ZeroSupport("Charlie");
Support bob = new LimitSupport("Bob", 100);
Support diana = new LimitSupport("Diana", 200);
Support elmo = new OddSupport("Elmo");
Support fred = new LimitSupport("Fred", 300); // 形成职责链
charlie.setNext(bob).setNext(diana).setNext(elmo).setNext(fred); // 制造各种问题, 并让这个责任链来处理
for (int i = 0; i < 500; i += 33) {
charlie.execute(new Trouble(i));
}
}
}

责任链模式-Chain of Responsibility(Java实现), 例1的更多相关文章

  1. 责任链模式-Chain of Responsibility(Java实现), 例2

    责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...

  2. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  3. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  4. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  5. 责任链模式/chain of responsibility/行为型模式

    职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...

  6. 23种设计模式--责任链模式-Chain of Responsibility Pattern

    一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...

  7. 责任链模式-Chain of Responsibility

    责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 责任链模式结构图: 代码实现: 责任链模式 ...

  8. 设计模式之二十:责任链模式(Chain of Responsibility)

    感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有 ...

  9. 责任链模式(Chain of Responsibility、Handler)(请求处理建立链)

    (使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.) 从名字中看出 ,系统中将会存在多个有类似处理能力的对 ...

随机推荐

  1. gitbook 入门教程之主题插件

    主题插件 目前 gitbook 提供三类文档: Book 文档,API 文档和 FAQ 文档. 其中,默认的也是最常使用的就是 Book 文档,如果想要了解其他两种文档模式,需要引入相应的主题插件. ...

  2. ext整合highcharts实现饼图

    extjs自身有图表的功能,但是与highcharts和echarts相比,ext不如它们功能强大.样式美观. 公司项目的前端框架使用的是ext,所以就有了ext整合第三方图表插件的需求. 笔者会一点 ...

  3. 本地服务器硬件信息获取指令wmic

    获取BIOS序列号 wmic bios list full | find "SerialNumber" SerialNumber=P50168VB 获取CPUID(WIN32_PR ...

  4. 如何查看linux中文件打开情况

    前言 我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof. linux下有哪些文件 在介绍lsof命 ...

  5. centos基本命令

    $>ls $>ls --help //查看命令帮助 $>man ls //查看命令帮助 $>clear //清屏 $>cd /home //切换目录 $>cd . ...

  6. 智表ZCELL产品V1.4.0开发API接口文档 与 产品功能清单

    为了方便大家使用ZCELL,应网友要求,整理编写了相关文档,现与产品一起同步发布,供大家下载使用,使用过程中如有疑问,请与我QQ联系. 智表(ZCELL)V1.4.0版本  功能清单文档下载地址: 功 ...

  7. Eclipse为工具包关联源码(本例工具包为dom4j-1.6.1)

    最近学习了dom4j解析xml文件,然而在eclipse中,每次想看源码都要去到源代码文件里看,不能在eclipse中直接看, 然后我就瞎折腾,终于知道怎么把源代码添加到eclipse中了.(我的ec ...

  8. Vue-cli在webpack内使用雪碧图(响应式)

    先执行install cnpm install webpack-spritesmith 文件位置 build\webpack.dev.conf.js 添加内容: const SpritesmithPl ...

  9. P4014 分配问题 网络流

    题目描述 有 nn 件工作要分配给 nn 个人做.第 ii 个人做第 jj 件工作产生的效益为 c_{ij}cij​ .试设计一个将 nn 件工作分配给 nn个人做的分配方案,使产生的总效益最大. 输 ...

  10. ubuntu 安装 google Gtest [转]有效性待验证

    最近在做一些东西,用过gtest,废话少说,现讲其再ubuntu上安装的 方法贴出来,以供朋友们参考: 安装gtest分三步: 1.安装源代码 在ubuntu的桌面上,右键选择打开终端,在终端中输入如 ...