Chain of Responsibility也就是职责链模式,通过使用链式结构,使对象都有机会处理请求,从而避免请求的发送者与接受者间的耦合关系。将这些对象连成链,并沿着该链传递请求,直到有对象处理为止。

实现的关键在于处理对象的转发机制,也就是如果我能处理,那么我处理,如果不能处理,就转发给后面的对象处理。但普通的实现方法中,该处理对象必须保有后面对象的引用,也就是仍存在一定程度的耦合。理想的情况是处理对象(handler)之间彼此不知对方,通过另外的机制完成对象传递。

Apache有开源框架实现职责链模式,用户可以通过配置xml来决定请求的处理顺序,而handler只需实现固定接口即可。

举个例子:

某皮包公司有各种总,但这些总共享三个秘书(不要理解错了),分为为lilyzhou, LucyWang和RuHua。总们签署的文件会交给秘书们处理,lilyzhou是大秘,LucyWang是二秘,RuHua是三秘。liliy不愿意处理的文件交给LucyWang,LucyWang不愿意处理的交给Ruhua。ruhua没有不愿意的权利,只能自己处理。

秘书们的特殊爱好如下:lilyzhou只处理boss.zhang签署的文件(她认为自己是秘书中的老大),LucyWang只处理boss.li签署的文件,Ruahua处理她们不愿意的处理的文件(有人的地方就有江湖啊)

下面贴出代码:

package com.inspur.jiyq.designpattern.responsibilitychain;

public interface Secretary {
public void handover(ImporantFile file); public void dealWithIt(ImporantFile file);
}

  

package com.inspur.jiyq.designpattern.responsibilitychain;

public class ImporantFile {
/**
* 文件签名 boss.zhang, boss.li, bossWang
*/
private String signature; public String getSignature() {
return signature;
} public void setSignature(String signature) {
this.signature = signature;
}
}

  

package com.inspur.jiyq.designpattern.responsibilitychain;

import com.inspur.jiyq.designpattern.responsibilitychain.impl.LilyZhou;

public class BossOnDuty {
public static void main(String[] args)
{
ImporantFile file = new ImporantFile();
file.setSignature("boss.sun"); Secretary secretary = new LilyZhou();
secretary.handover(file);
}
}

  

package com.inspur.jiyq.designpattern.responsibilitychain.impl;

import com.inspur.jiyq.designpattern.responsibilitychain.ImporantFile;
import com.inspur.jiyq.designpattern.responsibilitychain.Secretary; public class LilyZhou implements Secretary {
private Secretary lucyWang = new LucyWang(); @Override
public void handover(ImporantFile file) {
if (file.getSignature().equals("boss.zhang")) {
dealWithIt(file);
} else {
lucyWang.handover(file);
}
} @Override
public void dealWithIt(ImporantFile file) {
// TODO Auto-generated method stub
System.out.println("lilyzhou deal with it.");
} }

  

package com.inspur.jiyq.designpattern.responsibilitychain.impl;

import com.inspur.jiyq.designpattern.responsibilitychain.ImporantFile;
import com.inspur.jiyq.designpattern.responsibilitychain.Secretary; public class LucyWang implements Secretary{
private Secretary ruhua = new RuHua(); @Override
public void handover(ImporantFile file) {
if (file.getSignature().equals("boss.li")) {
dealWithIt(file);
} else {
ruhua.handover(file);
}
} @Override
public void dealWithIt(ImporantFile file) {
System.out.println("lucyWang deal with it.");
} }

  

package com.inspur.jiyq.designpattern.responsibilitychain.impl;

import com.inspur.jiyq.designpattern.responsibilitychain.ImporantFile;
import com.inspur.jiyq.designpattern.responsibilitychain.Secretary; public class RuHua implements Secretary { @Override
public void handover(ImporantFile file) {
// RuHua can not deliever it to anybody else
dealWithIt(file);
} @Override
public void dealWithIt(ImporantFile file) {
System.out.println("RuHua deal with it.");
} }

  

设计模式 - chain of Responsibility的更多相关文章

  1. 深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)

    模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传 ...

  2. 设计模式之美:Chain of Responsibility(职责链)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现后继者链. 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链,并沿着这条 ...

  3. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...

  4. 设计模式:职责链模式(Chain Of Responsibility)

    定  义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 结构图: 处理请求类: //抽象处理类 abs ...

  5. [学习笔记]设计模式之Chain of Responsibility

    为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 最近时间比较紧,所以发文的速度相对较慢了.但是看到园子里有很多朋友对设计模式感兴趣,我感觉很高兴,能够和大家一起学习这些知识. 之前的 ...

  6. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

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

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

  8. atitit.(设计模式1)--—职责链(chain of responsibility)最佳实践O7 转换日期

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 能够选择的模式: 表格模式,责任链模式 1 3 ...

  9. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

随机推荐

  1. 简单3D翻转

    1.先上图~~~ 2.代码 html部分 <body> <div id="my3d"> <div id="box"> < ...

  2. jQuery回车事件

    有网就是好. 全局事件: document.onkeydown=function(e){ var ev=document.all?window.evevt:e; if(ev.keyCode==13){ ...

  3. install ruby and ruby gem

    sudo apt-get install ruby #find an folder and: git clone https://github.com/rubygems/rubygems.git cd ...

  4. 4、WPF应用程序的启动

    启动第一步: 启动第二步 启动第三步:

  5. 四、mysql内置函数

    .字符串函数 concat('a','b'); 字符串拼接函数 ,,"我是A我是B"): 从指定位置开始替换指定长度的指定数据(起步为1) lower() 转小写 upper() ...

  6. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(八)

    使用 HttpResponse 对象 HttpResponse 对象是与 HttpRequest 对象相对应的,用来表示构建中的响应.它当中提供了方法和属性可供我们自定义响应,有一些在使用 MVC 视 ...

  7. 【BZOJ 2301】[HAOI2011]Problem b

    Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

  8. Jplayer(转)

    Jplayer必须要加载 1.样式  jplayer.blue.monday.css 2.jq jquery.1.6.2.min.js 当前最新版本为1.6.2 3.jplayer的js jquery ...

  9. Windows调试的基石——符号(1)

    当应用程序被链接以后,代码被逐一地翻译为一个个的地址,优化以后的代码可能初看起来更是面目全非.每当我们使用vs或者windbg等微软的调试工具进行调试的时候,我们可以方便地使用变量名来查看内存.可以使 ...

  10. tomcat部署javaweb项目的三种方式

    一.将项目文件夹或war包直接拷贝到tomcat的webapps下 二.在Tomcat\conf\Catalina\localhost下建立xml文件 修改内容如下<Context path=& ...