责任链(Chain of Responsibility)模式 :

  责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系。将这些处理对象连成一条链,沿着这条链传递该请求,直到有一个对象处理它为止。责任链模式强调的是每一个对象及其对下家的引用来组成一条链,利用这种方式将发送者和接收者解耦,类图如下:

通过上图可以看出责任链模式有两个角色:
抽象处理者(Handler)角色 :定义一个请求的接口。如果需要可以定义个一个方法用来设定和返回下家对象的引用。
具体处理者(ConcreteHandler)角色 :如果可以处理就处理请求,如果不能处理,就把请求传给下家,让下家处理。也就是说它处理自己能处理的请求且可以访问它的下家。
 
代码演示:
 
1.新建一个抽象处理角色,当然,它是一个abstract类,因为里面的处理方法要给每个具体角色类去扩展使用
/**
* 抽象处理角色
* @author mlxs
*
*/
public abstract class Hander { /**
* 处理角色 实例
*/
protected Hander hander; /**
* 抽象处理方法:执行处理
*/
public abstract void doHander(String reqStr); public Hander getHander() {
return hander;
} public void setHander(Hander hander) {
this.hander = hander;
} }

2.添加3个具体实现子类:HanderFirst,HanderSecond,HanderLast,并实现doHander方法

/**
* 具体处理角色
* @author mlxs
*
*/
public class HanderFirst extends Hander { @Override
public void doHander(String reqStr) {
//得到当前处理角色
Hander nowHander = getHander();
//判断:如果是自己的责任,则处理,处理完后结束(return);否则,传给下一角色处理
if(reqStr.equals("HanderFirst")){
System.out.println("---Hander1 doHander()---");
return;
}else{
//不是自己的责任,责任推给下家
System.out.println("Hander1 pass --> next");
nowHander.doHander(reqStr);
}
}
}
/**
* 具体处理角色
* @author mlxs
*
*/
public class HanderSecond extends Hander { @Override
public void doHander(String reqStr) {
//得到当前处理角色
Hander nowHander = getHander();
//判断:如果是自己的责任,则处理,处理完后结束(return);否则,传给下一角色处理
if(reqStr.equals("HanderSecond")){
System.out.println("---Hander2 doHander()---");
return;
}else{
//不是自己的责任,责任推给下家
System.out.println("Hander2 pass --> next");
nowHander.doHander(reqStr);
}
}
}
/**
* 具体处理角色
* @author mlxs
*
*/
public class HanderLast extends Hander { @Override
public void doHander(String reqStr) {
//如果前面的都没处理,最后一家处理
System.out.println("...\n---HanderLast doHander()---");
} }

3.编写客户端请求类:Main

public class Main {

    public static void main(String[] args) {

        //创建3个具体处理者
Hander hander1 = new HanderFirst();
Hander hander2 = new HanderSecond();
Hander hander3 = new HanderLast(); //3个处理者链接,形成责任链
hander1.setHander(hander2);
hander2.setHander(hander3); //从hander1开始处理请求
// hander1.doHander("HanderFirst");
// hander1.doHander("HanderSecond");
hander1.doHander("hahahahh");
}
}

4.运行,查看结果

Hander1 pass --> next
Hander2 pass --> next
...
---HanderLast doHander()---

过滤器和拦截器,就是通过这种模式思想写的,,,

chainOfResponsibility责任链模式的更多相关文章

  1. 十四、ChainOfResponsibility 责任链模式

    设计: 代码清单: Trouble: public class Trouble { private int number; public Trouble(int number){ this.numbe ...

  2. Java设计模式---ChainOfResponsibility责任链模式

    参考于 : 大话设计模式 马士兵设计模式视频 代码参考于马士兵设计模式视频 写在开头:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系 图来自大话设计模式,下面我的代 ...

  3. 学习笔记——责任链模式ChainOfResponsibility

    责任链模式,主要是通过自己记录一个后继者来判断当前的处理情况.Handler中,再增加一个方法用于设置后继对象,如SetHandler(Handler obj). 然后Handler类以其子类的处理方 ...

  4. 责任链模式(chainOfResponsibility)

    参考文章:http://wiki.jikexueyuan.com/project/design-pattern-behavior/chain-four.html 定义: 使多个对象都有机会处理请求,从 ...

  5. C#设计模式-责任链模式

    在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所以在面试的 ...

  6. C#设计模式(21)——责任链模式

    一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所 ...

  7. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  8. 24种设计模式--责任链模式【Chain ofResponsibility Pattern】

    中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父.既嫁从夫.夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的,举个例子来说,一个女 ...

  9. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

随机推荐

  1. android 开发工具(android studio)

      Android Studio 从安装到配置使用 okhttp比xutils功能强大,源码地址: https://github.com/search?utf8=✓&q=okhttp andr ...

  2. webssh software

    shellinabox是由Markus Gutschke开发的一款自由开源的基于Web的Ajax的终端模拟器.它使用AJAX技术,通过Web浏览器提供了类似原生的 Shell 的外观和感受. yum ...

  3. Delphi 调用 Rest 服务的一些

    1.关于数据接收的格式 测试发现获取的json源数据中间汉字的地方是乱码,导致引号不配对,引发内存错误. TIdHttp在获取数据之前,要将定义的TStringStream的Encoding设置为UT ...

  4. C#(winform)浏览按钮

    FolderBrowserDialog folderBrowser = new FolderBrowserDialog();            //folderBrowser.SelectedPa ...

  5. 定义提示符 PS1 PS4

    PS1,如:[xiluhua@vm-xiluhua][~]$ # prompt PS1 export PATH BLUE=$(tput setaf ) PURPLE=$(tput setaf ) YE ...

  6. 将Nagios监控信息存入Mysql

    一.NDOUtils安装需求: nagios:安装方法:http://www.cnblogs.com/Richardzhu/p/3340638.html mysql:源码安装方法:http://www ...

  7. POJ 3349:Snowflake Snow Snowflakes(数的Hash)

    http://poj.org/problem?id=3349 Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K T ...

  8. 【转】在Eclipse中建立第一个Servlet程序

    转载地址:http://kin111.blog.51cto.com/738881/163354 继上篇在Eclipse中搭好了tomcat环境后,我们建立一个最简单的servlet程序,这个serve ...

  9. HDU 4712:Hamming Distance

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  10. c#danliemosih

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 打印机 ...