Chain of Responsibility模式又叫做责任链模式,是将多个对象组成一条职责链,然后按照职责链上的顺序一个一个的找出是谁来负责处理。

这个模式很简单,下面就是一个实例程序,有六个处理器,能分别处理一些六个级别的问题,现在有一堆问题在那,那么我们就把处理器进行串行连接,依次将问题通过,如果是自己的那就处理,不是自己的那就不处理,让下一个处理器处理,最后都没处理器处理的就直接输出,控制台打印没处理器处理。

  • Trouble问题的类
package site.wangxin520.gof.chain;

/**
* 责任链模式的问题 在责任链处理的过程中,将问题传入责任链中,在符合要求的责任链中进行操作
*
* @author wangXgnaw
*
*/
public class Trouble { // 级别
private int number; // 问题名字
private String name; /**
* 传入问题的级别和名字
*
* @param number
* @param name
*/
public Trouble(int number, String name) {
super();
this.number = number;
this.name = name;
} public int getNumber() {
return number;
} public void setNumber(int number) {
this.number = number;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
  • Chain处理器的父类
package site.wangxin520.gof.chain;

/**
* 责任链的抽象类 定义了责任链的规范和方法
*
* @author wangXgnaw
*
*/
public abstract class Chain { // 定义责任链的名字
private String name; // 下一个责任链
private Chain next; /**
* 构造方法,责任链的构造
* @param name
*/
public Chain(String name) {
this.name=name;
} /**
* 这个是重点,设置责任链下一个责任人,并且返回下一个责任人。
* 这个样子就可以使用链式编程的方式进行操作。
* @param next
* @return
*/
public Chain setNextChain(Chain next){
this.next=next;
return next;
} /**
* 这个方法是规定了子类实现的方法,用于解决问题
* @param trouble 传入问题
* @return boolean 返回是否解决成功
*/
protected abstract boolean solveProblem(Trouble trouble); /**
* 解决问题的方法,传入问题
* @param trouble
*/
public void solve(Trouble trouble){
if(solveProblem(trouble)){
System.out.println(name+"把"+trouble.getName()+trouble.getNumber()+"级别的问题解决了");
}else if(null ==next){
System.out.println(trouble.getName()+"这个问题解决不了!");
}else{
next.solve(trouble);
}
} }
  • 处理器,这里只列举了处理器1,其他的都一样
package site.wangxin520.gof.chain;

/**
* 解决一级问题
* @author wangXgnaw
*
*/
public class Chain1 extends Chain{ public Chain1(String name) {
super(name);
} @Override
protected boolean solveProblem(Trouble trouble) {
if(trouble.getNumber()==1){
return true;
}
return false;
} }
  • 测试类
package site.wangxin520.gof.chain;

import java.util.Random;

/**
* 责任链模式的测试
*
* @author wangXgnaw
*
*/
public class Test { public static void main(String[] args) { //新建一些处理器
Chain1 chain1 = new Chain1("处理器1");
Chain2 chain2 = new Chain2("处理器2");
Chain3 chain3 = new Chain3("处理器3");
Chain4 chain4 = new Chain4("处理器4");
Chain5 chain5 = new Chain5("处理器5");
Chain6 chain6 = new Chain6("处理器6"); //设置各个处理器之间的链关系,这里注意的是,不要弄成环,只要是链就行
chain1.setNextChain(chain2).setNextChain(chain3).setNextChain(chain4).setNextChain(chain5).setNextChain(chain6); Random r=new Random(); //设置是个问题,让处理器1去执行,如果1执行不了的话,就会自动找到下一个处理器2执行依次下去。。。
for (int i = 0; i <10; i++) {
int num=r.nextInt(10)+1;
Trouble trouble = new Trouble(num, "问题"+(i+1)+"号");
chain1.solve(trouble);
} }
}
  • 控制台输出

由控制台可以看出,问题一号一直被推脱给了六号处理器,问题2号还没有被解决……

可见责任链模式还是很简单的!

设计模式之——Chain of Responsibility的更多相关文章

  1. [学习笔记]设计模式之Chain of Responsibility

    为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 最近时间比较紧,所以发文的速度相对较慢了.但是看到园子里有很多朋友对设计模式感兴趣,我感觉很高兴,能够和大家一起学习这些知识. 之前的 ...

  2. 设计模式之Chain of Responsibility(职责链)(转)

    Chain of Responsibility定义 Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...

  3. (转)职责链设计模式(Chain of Responsibility)

    Chain of Responsibility定义Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯 ...

  4. 设计模式(13)--Chain of Responsibility(责任链模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...

  5. go语言设计模式之Chain Of Responsibility(责任链)

    ChainOfResponsibility.go package ChainOfResponsibility import ( "fmt" "io" " ...

  6. python 设计模式之 (Chain of Responsibility)责任链模式

    #写在前面 对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的.所以弄明白很重要. 等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场 #责任链模式定义 简书上一网友就把这个定义 ...

  7. 设计模式:chain of responsibility模式

    目的:弱化发出请求的对象和处理请求对象的之间的关系 理解:每个处理请求的对象仅仅只关注自己能处理的请求,不关系其他请求 优点: 无需一个管理类来匹配所有的请求,更灵活 责任链可以动态的调整 Andor ...

  8. 深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)

    模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传 ...

  9. 设计模式之美:Chain of Responsibility(职责链)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现后继者链. 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链,并沿着这条 ...

随机推荐

  1. linux -- Apache执行权限

    最近在用php调用exec方法去执行一个linux终端下的命令,结果每次都不能执行成功,网上多番搜寻,最终找到一篇有用的文章,主要原因是因为Apache的执行权限的问题.以下是原文(稍加修改): 利用 ...

  2. 手动安装OpenStack Mistral

    Prepare packages: $ sudo apt-get install python-dev python-setuptools python-pip libffi-dev libxslt1 ...

  3. 使用GitHub和Eclipse进行javaEE开发步骤

    下载Git客户端:链接:http://pan.baidu.com/s/1jIueUEy 密码:7gef; 下载Eclipse javaee客户端:http://www.eclipse.org/down ...

  4. NSArray打印汉字的方法

    (1) NSArray打印汉字 通过重载NSArray的- (NSString *)descriptionWithLocale:(id)locale方法 方法体例如以下: //依据设置的locale ...

  5. app服务端server端数据库设计

  6. cesium可视化空间数据1

    ---恢复内容开始--- 1.多边形 我们要从经度和纬度列表中为美国怀俄明州添加一个多边形.(怀俄明被选中是因为它是一个简单的多边形.)我们可以复制并粘贴以下代码到Sandcastle中:   < ...

  7. jquery 中的回调函数,回调函数(callback)是什么?

    知乎上果然大牛比较多 大神解释如下: 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里, ...

  8. NHibernate之映射文件配置说

    1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...

  9. Collabration Web Application Screenshot(English Language) Free download now!

    The screenshots of english language version collabration web application which is as following: Incl ...

  10. GLSL/C++ 实现滤镜效果

    入门效果之浮雕 "浮雕"图象效果是指图像的前景前向凸出背景.常见于一些纪念碑的雕刻上.要实现浮雕事实上很easy.我们把图象的一个象素和左上方的象素进行求差运算.并加上一个灰度.这 ...