设计模式之——Chain of Responsibility
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的更多相关文章
- [学习笔记]设计模式之Chain of Responsibility
为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 最近时间比较紧,所以发文的速度相对较慢了.但是看到园子里有很多朋友对设计模式感兴趣,我感觉很高兴,能够和大家一起学习这些知识. 之前的 ...
- 设计模式之Chain of Responsibility(职责链)(转)
Chain of Responsibility定义 Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...
- (转)职责链设计模式(Chain of Responsibility)
Chain of Responsibility定义Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯 ...
- 设计模式(13)--Chain of Responsibility(责任链模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...
- go语言设计模式之Chain Of Responsibility(责任链)
ChainOfResponsibility.go package ChainOfResponsibility import ( "fmt" "io" " ...
- python 设计模式之 (Chain of Responsibility)责任链模式
#写在前面 对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的.所以弄明白很重要. 等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场 #责任链模式定义 简书上一网友就把这个定义 ...
- 设计模式:chain of responsibility模式
目的:弱化发出请求的对象和处理请求对象的之间的关系 理解:每个处理请求的对象仅仅只关注自己能处理的请求,不关系其他请求 优点: 无需一个管理类来匹配所有的请求,更灵活 责任链可以动态的调整 Andor ...
- 深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)
模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传 ...
- 设计模式之美:Chain of Responsibility(职责链)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现后继者链. 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链,并沿着这条 ...
随机推荐
- find_circ 识别circRNA 的原理
find_circ 通过识别junction reads 来预测circRNA 和参考基因组比对完之后,首先剔除和基因组完全比对的reads,保留没比对上的reads, 这部分reads 直接比是比对 ...
- 内网DNS投毒技术劫持会话
工具列表: tcpdump Ferret Hamster node closurether 拓扑环境: 攻击机:Kali 10.10.10.237 被攻击机: win7 10.10.10.232 因为 ...
- u3d发布成全屏的方式
using UnityEngine; using System.Collections; public class example : MonoBehaviour { public voi ...
- Spring-处理自动装配的歧义性
自动装配可以对依赖注入提供很大帮助,因为它会减少装配应用程序组件时所需的显式装配的数量. 不过,仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不仅有一个bean能够匹配的话,这种歧义性会阻 ...
- Unity 大版本更新之APK的下载与覆盖安装
作为一个游戏开发者,更新这个技能是必不可少的!更新分为游戏内的更新,也就是所谓的资源热更包括AssetBundle更新和代码更新,代码其实也是所谓的二进制文件,在安卓上和普通资源文件毫无差异,然而在I ...
- mysqldump: command not found
原因:这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,当然会找不到命令,我们需要做的就是映射一个链接到/usr/bin目录下,相当于建立一个链接文件.首先得知道mysql命 ...
- Java精选笔记_多线程(创建、生命周期及状态转换、调度、同步、通信)
线程概述 在应用程序中,不同的程序块是可以同时运行的,这种多个程序块同时运行的现象被称作并发执行. 多线程可以使程序在同一时间内完成很多操作. 多线程就是指一个应用程序中有多条并发执行的线索,每条线索 ...
- complex()
complex() 用于将一个对象转换为复数 In [1]: complex(123) # 将整数转换为复数 Out[1]: (123+0j) In [2]: complex(') # 将纯数字的字符 ...
- m2014-architecture-imgserver->Lighttpd +mod_mem_cache的效果简直太好了
公司的图片服务器一直以来负载都比较高,原因是图片比较分散而且比较小.经常把iowait搞的特别的高.但是只有一台机器也法用squid,经测试squid和apache在同一台机器效果会很糟糕的.因为sq ...
- CentOS6.4环境下布署LVS+keepalived笔记
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://400053.blog.51cto.com/390053/713566 环境: 1 ...