责任链(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. nginx 反向代理 和lvs负载均衡

    nginx反向代理:用户请求nginx代理服务器然后代理服务器将用户请求转为服务器再由nginx代理服务器将服务器的响应反应给用户. lvs负载均衡:用户请求nginx代理服务器然后代理服务器将用户请 ...

  2. SQL学习记录

    一些最重要的 SQL 命令 SELECT - 从数据库中提取数据 UPDATE - 更新数据库中的数据 DELETE - 从数据库中删除数据 INSERT INTO - 向数据库中插入新数据 CREA ...

  3. 160926、Java-SpringMVC统一异常处理

    从零开始学 Java - Spring MVC 统一异常处理 看到 Exception 这个单词都心慌 如果有一天你发现好久没有看到Exception这个单词了,那你会不会想念她?我是不会的.她如女孩 ...

  4. ansible

    3.1 配置 #vim /etc/ansible/hosts       //定义主机,支持IP和域名,支持分组 [local] 127.0.0.1 [nginx] 192.168.0.10     ...

  5. maven手动安装jar到本地仓库

    比如oracle驱动ojdbc5.jar 1,安装MAVEN,并配置系统环境变量 2,将jar文件复制到d: 3,打开cmd窗口,cd到d: 4,执行命令:mvn install:install-fi ...

  6. 面向生产环境的大集群模式安装Hadoop

    一.实验说明 1.本实验将使用DNS而不是hosts文件解析主机名: 2.使用NFS共享密钥文件,而不是逐个手工拷贝添加密钥: 3.复制Hadoop时使用批量拷贝脚本而不是逐台复制. 测试环境: Ho ...

  7. 发送xml报文去第三方请求获取xml报文数据

    import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import j ...

  8. ACM题目————Robot Motion

    Description A robot has been programmed to follow the instructions in its path. Instructions for the ...

  9. Python time clock()方法

    描述 Python time clock() 函数以浮点数计算的秒数返回当前的CPU时间.用来衡量不同程序的耗时,比time.time()更有用. 这个需要注意,在不同的系统上含义不同.在UNIX系统 ...

  10. java 类加载顺序

    1.虚拟机在首次加载Java类时,会对静态初始化块.静态成员变量.静态方法进行一次初始化 2.只有在调用new方法时才会创建类的实例 3.类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始 ...