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. 用cxf生成webservice的java客户端代码

    百度来的: 最近,由于要用到某公司提供的webservice实现的api接口,想到了用cxf的wsdl2java工具来生成客户端程序.(自己写是比较麻烦且费时,so偷懒一下..) 使用步骤如下: 一. ...

  2. iOS推送证书从申请到使用

    关于这个话题,已经有非常多写的非常好的文章了.可是,在自己做的过程中,即使别人写的已经非常好了,还是会遇到这样那样的问题. 自己还是再写一遍吧. 本文记录了从无到有申请证书,到最后可以发出通知.当然, ...

  3. 使用libcurl源代码编译只是的问题

    curl 7.21.6 + vs2005 就把curl的.c文件加到project中编译.报错信息非常古怪: setup_once.h(274) : error C2628: '<unnamed ...

  4. u3d调用自己的dll

    原文地址:http://blog.sina.com.cn/s/blog_62f7cb730100zhhf.html 首先用vc建立一个dll工程 然后在里面建立一个testunity.h文件.内容如下 ...

  5. c++ 在线编译

    #include <algorithm> #include <cstdlib> #include <fstream> #include <iostream&g ...

  6. SharePoint 2013 一次性上传文件大小限制

    默认是250MB,最大一次上传文件不超过2G The defaut size is 250MB and maximun upload size is 2047MB. It's can't greate ...

  7. delphi7中添加QuickRep

    具体的方法是: delphi主菜单的Project|Options命令, 在Package选项卡的Desing packages列表中如果可以看到QuickReport Components选项, 那 ...

  8. mysql中,now()函数和sysdate()函数有什么区别?

    问题描述: 今天在看mysql的时间函数,now()和sysdate(),记录下两者之间有什么不同. 实验过程: 1.执行以下的两个语句: mysql),now(); +--------------- ...

  9. chrome JS 总结

    1. chrome 的 console 中不能添加本地文件 2. 下面的代码是在亚马逊的商品页面上添加一个 image, 点击之后触发 alert 函数. 其中 cBoxInner 是人工寻找到的标签 ...

  10. 如何根据select选择的值反查option的属性

    有时候select已经被选中了,想知道这个选中option的属性又该如何处理呢? 我这里提供一种粗暴的方式 <!DOCTYPE HTML> <html lang="en-U ...