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. nodejs npm install全局安装和本地安装的区别

    npm的包安装分为本地安装(local).全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如:代码如下:复制代码npm install # 本地安装npm install - ...

  2. webpack减少打包后文件体积的几种方法

    webpack 把我们所有的文件都打包成一个 JS 文件,这样即使你是小项目,打包后的文件也会非常大.下面就来讲下如何从多个方面进行优化. 去除不必要的插件 刚开始用 webpack 的时候,开发环境 ...

  3. 生成静态页面的PHP类

    生成静态页面的PHP类: 复制代码代码如下: <?php   class html   {    var $dir; //dir for the htmls(without/)    var $ ...

  4. CorelDRAW 文件实用工具 CDRTools 2

    随着 CorelDRAW 更新脚步越来越频繁,版本之间兼容性问题越来越突出,特别是跨版本之间打开会有很多问题,比如:文字跑位.透镜变向.位图出错.颜色改变,甚至会造成文件损坏.最好的办法就是哪一个版本 ...

  5. (转载)异构数据库之间完全可以用SQL语句导数据

    <来源网址:http://www.delphifans.com/infoview/Article_398.html>异构数据库之间完全可以用SQL语句导数据 告诉你一个最快的方法,用SQL ...

  6. jsp+oracle 排序分页+Pageutil类

    1.rownum和排序 Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了. SQL> select rownum ,id,n ...

  7. Servlet一次乱码排查后的总结(转)

    原文地址:http://my.oschina.net/looly/blog/287255 由来 在写一个小小的表单提交功能的时候,出现了乱码,很奇怪request上来的参数全部是乱码,而从数据库查询出 ...

  8. Raft、Zab

    Raft.Zab 引言 <分布式系统理论进阶 - Paxos>介绍了一致性协议Paxos,今天我们来学习另外两个常见的一致性协议--Raft和Zab.通过与Paxos对比,了解Raft和Z ...

  9. servlet的生命周期与工作原理、使用!

    概念: Servlet是一个java程序运行在服务器上,处理客户端请求并做粗响应的程序!Servlet是和平台无关的服务器组件,它运行在Servlet容器中,Servlet容器 负责servlet和客 ...

  10. 实时数据处理环境搭建flume+kafka+storm:3.kafka安装

    1.  解压  tar -zxvf   2.配置/app/kafka_2.9.2-0.8.1.1/config/server.properties     #标识--     broker.id=0 ...