责任链(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 学习随笔十(网络:get、post提交数据)

    1.get public class Tools { public static String getTextFromStream(InputStream is){ byte[] b = new by ...

  2. js正则函数match、exec、test、search、replace、split使用介绍集合

    match 方法 使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回. stringObj.match(rgExp) 参数 stringObj 必选项.对其进行查找的 String 对 ...

  3. django中request对象详解(转载)

    django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. ...

  4. 161208、Java enum 枚举还可以这么用

    在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 先来看一段代码示例: ...

  5. 160908、前端开发框架Semantic UI

    简介 网页开发中,CSS控制网页样式.作为测试开发工程师,我个人不太擅长手写CSS.样式微调.兼容浏览器等工作,所以我选择使用成熟的前端框架,可以快速开发出样式美观的网站,也解决了大部分浏览器兼容问题 ...

  6. Error: 16GU盘变1G,恢复

    最近装win10,chromium os之后,删除U盘中的文件,发现不能删除,脑子一热格式化了,发现16G突然变成了1G,这不是坑爹吗,刚买的新U盘呀.立马百度,发现有说是买的被骗了,有的说使用某个软 ...

  7. Linux/Unix中的#!和!#

    是不是在Terminal输入命令的时候,输入了很长的一个路径,然后发现还有在同一条命令中再输一次的时候很恼火,其实Shell是提供了trick的,就是使用!#(和#!不同哦) 习惯写脚本的猿,通常对于 ...

  8. js对select动态添加和删除OPTION

    <select id="ddlResourceType" onchange="getvalue(this)"> </select> 动态 ...

  9. wordpress网站被挂马以及防御方法

    wordpress本身的安全性是非常的高的,一般不会被轻易的破解,被挂马,但是我们也不能够过度迷信wordpress的安全性,凡是连接上互联网的服务器和电脑,都存在被破解的风险性.所以我们在日常维护自 ...

  10. java 面试每日一题2

    题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. 注:如果想单独输出中文的个数和中文符号的个数,只需把isChinese()中的if语句修改 知识补充: java不像C中拥有s ...