设计模式之——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(职责链)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现后继者链. 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链,并沿着这条 ...
随机推荐
- linux -- ubuntuserver 安装Apache后,修改默认目录和分布式配置文件可执行
装了apache后,访问出现The requested URL *** was not found on this server,查看了下/etc/httpd/conf/httpd.conf,发现原因 ...
- 好的API设计
[非原创,原文链接] API设计书籍下载: 1.keynote.pdf 2.api-design.pdf 最近在重构公司的一个交互中间件,在重新设计API及总体架构的时候思考了许多, 不禁萌发了一个疑 ...
- Qt模态与非模态
模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口.非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框. 如果从线程角度来讲,模态对话 ...
- 【转载】PADS Layout将导入DXF,并转换成板框步骤
1.在PADS Layout中选择 Import... 2.选择DXF文件(一般由结构工程师给出),直接点OK即可. 3.导入后,板框图一角视图如下.右键选择 Select Shapes,然后双击外框 ...
- 【Java面试题】1 Java中使用switch-case的用法及注意事项超全总结
今天在用到switch的时候,这种设计到最基本的内容,可能忘记它的一些基本语法,出现了一些错误,所以即兴从各种资料查询总结了下面的内容,希望可以帮助那些正在困扰switch错误和各种细节问题的朋友! ...
- android获取手机屏幕分辨率
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt ...
- ASP.NET MVC自定义验证Authorize Attribute(包含cookie helper)
前几天Insus.NET有在数据库实现过对某一字段进行加密码与解密<使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和 ...
- linux mint 19解决 输入法问题
安装搜狗后出现 You're currently running Fcitx with GUI, but fcitx-configtool couldn't be found, the package ...
- error C2275: 'SOCKET' : illegal use of this type as an expression
在VC中编译xxx.c文件出现错误error C2275 illegal use of this type as an expression 问题在于C99之前要求所有的声明必须放在函数块的起始部分, ...
- Mike Gancarz:Linux/Unix设计思想
Mike Gancarz是一位技术布道者. 他是Linux/Unix最基本的倡导者之中的一个,也是最早开发X Window System的先驱.他把一些在Unix/Linux社区里口口相 ...