Chain Of Responsibility 职责链模式(行为型模式)

请求的发送者与接受者

某些对象请求的接受者可能有多种多样,变化无常……

动机(Motivation)

在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合。

如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。

意图(Intent)

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。——《设计模式》GoF

示例代码

    public abstract class BaseHandler
{
public abstract void HandleRequest(Request request);
public abstract bool CanHandleRequest(Request request);
} public class AHandler : BaseHandler
{
public override void HandleRequest(Request request)
{
//...
} public override bool CanHandleRequest(Request request)
{
//...
}
} public class BHandler : BaseHandler
{
public override void HandleRequest(Request request)
{
//...
} public override bool CanHandleRequest(Request request)
{
//...
}
} public class CHandler : BaseHandler
{
public override void HandleRequest(Request request)
{
//...
} public override bool CanHandleRequest(Request request)
{
//...
}
} public class Request
{
//...
} public class Sender
{
public void Process()
{
Request request=new Request();
//...
List<BaseHandler> handlerList=new List<BaseHandler>();
handlerList.Add(new AHandler());
handlerList.Add(new BHandler());
handlerList.Add(new CHandler()); foreach (var handler in handlerList)
{
if (handler.CanHandleRequest(request))
{
handler.HandleRequest(request);
}
}
}
}

如果我们不希望Sender中有这么多的Handler的调用,可以通过指责链模式修改:

    public abstract class BaseHandler
{
public BaseHandler(BaseHandler next)
{
this.Next = next;
} public BaseHandler Next { get; set; } protected abstract bool CanHandleRequest(Request request); public virtual void HandleRequest(Request request)
{
if (this.Next != null)
{
this.Next.HandleRequest(request);
}
}
} public class AHandler : BaseHandler
{
public AHandler(BaseHandler next)
: base(next)
{
} public override void HandleRequest(Request request)
{
if (this.CanHandleRequest(request))
{
//...
}
else
{
base.HandleRequest(request);
}
} protected override bool CanHandleRequest(Request request)
{
//...
}
} public class BHandler : BaseHandler
{
public BHandler(BaseHandler next)
: base(next)
{
} public override void HandleRequest(Request request)
{
//...
} protected override bool CanHandleRequest(Request request)
{
//...
}
} public class CHandler : BaseHandler
{
public CHandler(BaseHandler next)
: base(next)
{
} public override void HandleRequest(Request request)
{
//...
} protected override bool CanHandleRequest(Request request)
{
//...
}
} public class Request
{
//...
} public class Sender
{
public void Process(BaseHandler handler)
{
Request request = new Request();
//...
handler.HandleRequest(request);
}
}

客户端调用:

        static void Main(string[] args)
{
Sender sender=new Sender(); BaseHandler handler1 = new AHandler(null);
BaseHandler handler2 = new BHandler(handler1);
BaseHandler handler3 = new CHandler(handler2); sender.Process(handler3); Console.ReadKey();
}

结构(Structure)

一个典型的对象结构可能如下图所示:

Handler——定义一个处理请求的接口。(可选)实现后继链。
ConcreteHandler——处理它所负责的请求。可访问它的后继者。如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
Client——向链上的具体处理者(ConcreteHandler)对象提交请求。

Chain Of Responsibility 模式的几个要点

  • Chain Of Responsibility 模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个”,只有这时候请求发送者与接受者的耦合才有可能出现“变化脆弱”的症状,职责链的目的就是将两者解耦,从而更好地应对变化。
  • 应用了Chain Of Responsibility 模式后,对象的职责分派将更具灵活性。我们可以在运行时动态添加、修改请求的处理职责。
  • 如果请求传递到职责链的末尾仍得不到处理,应该有一个处理的缺省机制。这也是每一个接受对象的责任,而不是发出请求的对象的责任。
  • 这种链传递的方式效率较低。

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

设计模式19:Chain Of Responsibility 职责链模式(行为型模式)的更多相关文章

  1. 设计模式(13)--Chain of Responsibility(责任链模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...

  2. 设计模式学习笔记——Chain of Responsibility职责链模式

    重点在链.一条链,如果本节点处理不了,则传递给下一个节点处理. 关键是如何传给下一个节点? 主要是由本节点决定传给哪一个节点. public class Client { public static ...

  3. python 设计模式之 (Chain of Responsibility)责任链模式

    #写在前面 对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的.所以弄明白很重要. 等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场 #责任链模式定义 简书上一网友就把这个定义 ...

  4. go语言设计模式之Chain Of Responsibility(责任链)

    ChainOfResponsibility.go package ChainOfResponsibility import ( "fmt" "io" " ...

  5. C#设计模式学习笔记:(20)职责链模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8109100.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第八个模式--职 ...

  6. 设计模式之第13章-职责链模式(Java实现)

    设计模式之第13章-职责链模式(Java实现) “请假都那么麻烦,至于么.”“咋的了?”“这不快过年了么,所以我想早两天回去,准备一下,买买东西什么的,然后去给项目经理请假,但是他说快过年了,所以这个 ...

  7. 基于.net 职责链来实现 插件模式

    插件式的例子 QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了 eclipse ,X Server 等等 插件式的好处 插件降低框架的复杂性,把扩展功能从框架中剥离出来 让第三方有机会来 ...

  8. .net 职责链来实现 插件模式

    .net 职责链来实现 插件模式 插件式的例子 QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了 eclipse ,X Server 等等 插件式的好处 插件降低框架的复杂性,把扩展功能 ...

  9. FactoryMethod工厂方法模式(创建型模式)

    1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...

随机推荐

  1. 转 maven jetty 插件

    maven jetty 插件使用 本机环境 JDK 7 Maven 3.2 Jetty 9.2 Eclipse Luna pom.xml 配置 在你的 pom.xml 文件中添加 jetty 插件的描 ...

  2. 聚合模型---K-Means

    聚类模型:K-Means 聚类(clustering)属于无监督学习(unsupervised learning) 无类别标记 在线 demo:http://syskall.com/kmeans.js ...

  3. 第6章Zabbix分布式监控

    Zabbix是一个分布式的监控系统.分布式监控适合跨机房.跨地域的网络监控.从多个Proxy收集数据,而每个Proxy可以采集多个设备的数据,从而轻松地构建分布式监控系统. ZabbixProxy可以 ...

  4. leetcode125

    public class Solution { Stack<char> S = new Stack<char>(); Queue<char> Q = new Que ...

  5. python拷贝目录下的文件

    #!/usr/bin/env python # Version = 3.5.2 import shutil base_dir = '/data/media/' file = '/backup/temp ...

  6. Delphi IOS class_addMethod

    class_addMethod 学习FMX.Platform.iOS.pas文件的处理办法 d:\program files (x86)\embarcadero\studio\17.0\source\ ...

  7. kibana-4.6.3-linux-x86_64.tar.gz的安装(图文详解)(升级)

     前期博客 kibana-4.6.3-linux-x86_64.tar.gz的下载(图文详解) 因为,我的机器情况是如下: 1.上传 [hadoop@master app]$ rz [hadoop@m ...

  8. ELK 日志管理系统,再次尝试记录

    简介: 第二次尝试 ELK 记录... 工作流程: 1.客户端的 Logstash 将日志信息采集到之后传输给 Redis 做消息队列 2.然后服务端的 Logstash 将日志从 Redis 中取出 ...

  9. 退出telnet 命令

    很多时候 telnet 完就无法退出了,ctrl+c 有时也无法退出 后来找到了正确的命令 ctrl+]  然后在telnet 命令行输入 quit  就可以退出了

  10. win7下IIS的安装和配置图文教程

    1. 首先是安装IIS.打开控制面板,找到”程序与功能”,点进去 2. 点击左侧”打开或关闭Windows功能” 3. 找到”Internet 信息服务”,按照下图打勾即可 等待安装完成 4. 安装完 ...