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. oracle中如何把结果集插入临时表中

    比如临时表叫temp,你要查询的语句为select * from 表名 where id=1. 1.建表temp 2.插入语句: ; commit;  

  2. Unity在协程内部停止协程自身后代码执行问题

    当在协程内部停止自身后,后面的代码块还会继续执行,直到遇到yield语句才会终止. 经测试:停止协程,意味着就是停止yield,所以在停止协程后,yield之后的语句也就不会执行了. 代码如下: us ...

  3. css两列等高布局

    布局方案 等高布局有几种不同的方法,但目前为止我认为浏览器兼容最好最简便的应该是padding补偿法.首先把列的padding-bottom设为一个足够大的值,再把列的margin-bottom设一个 ...

  4. 怎样设置table中td的高度为1px

    在制作edm时会遇到须要设置td的高度为1px,假设td标签中有 时不管你怎么设置td的高度都没用,最小高度都是18px. 这时须要把表格中的 去掉.例: 原来是这种: <tr> < ...

  5. with revoked permission android.permission.CAMERA

    1,刚出现这样的问题我是直接把 CAMERA 移除掉 2.第一步判断时候授权. if (Build.VERSION.SDK_INT >= 23) { int checkCallPhonePerm ...

  6. easyui —— footer

    前言: 使用easyui的datagrid,在最后一行加上“总计”字样,效果如下: 过程: ... <table id="dg" title="xx管理" ...

  7. Nginx虚拟主机配置教程

    说明:配置之前先把域名解析到服务器IP地址上 站点1:bbs.osyunwei.com  程序所在目录/data/osyunwei/bbs 站点2:sns.osyunwei.com  程序所在目录/d ...

  8. OpenGL开发环境简介

    基于OpenGL标准开发的应用程序运行时需有动态链接库OpenGL32.DLL.Glu32.DLL,这两个文件在安装Windows NT时已自动装载到C:\WINDOWS\SYSTEM32目录下(这里 ...

  9. React如何进行事件传参

    今天在学习React的es6语法的时候,发现了个有趣的现象,就是this的指向问题.es6的this不同于es5,它在创立函数伊始便已经存在了,而不是像es5一样,睡调用的函数,this指向谁.但是这 ...

  10. 用示例详解php连接数据库操作

    首先数据库mydb有三个表: 1  info表 2  users表 3  sname表 首先先做一个登录主页面 login_1.php <!DOCTYPE html PUBLIC "- ...