博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式基础】行为模式 - 3 - 职责链(Chain of responsibility)
阅读量:4007 次
发布时间:2019-05-24

本文共 2294 字,大约阅读时间需要 7 分钟。

1. 模式意图

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。

在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,知道链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配职责。

纯的与不纯的职责链模式:

一个纯的职责链模式要求一个具体的处理这对象只能在两个行为中选择一个:一个是承担职责;二是把职责推给下家。不允许出现某一个具体处理这对象在承担了一部分职责后又把职责向下传的情况。

在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接受;在一个不纯的职责链模式里,一个请求可以最终不被任何接收端对象所接受。

示例:

2. 模式定义

抽象处理者(Handler):                     定义一个处理请求的接口;如果需要,可以定义一个方法,用以设定和返回对下家的引用。

具体处理者(ConcreteHandler):   具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家;

Client:                                                向链上的具体处理者对象提交请求。

职责链模式并不创建职责链,职责链的创建必须由系统的其他部分创建出来

职责链可以是一条线,一个树,也可以是一个环;如下,职责链是一个树结构的一部分:

3. 模式实现

3.1 C#的职责链模式

// Chain of Responsibility pattern -- Structural example  using System;// "Handler"abstract class Handler{  // Fields  protected Handler successor;   // Methods  public void SetSuccessor( Handler successor )  {    this.successor = successor;  }  abstract public void HandleRequest( int request );}// "ConcreteHandler1"class ConcreteHandler1 : Handler{  // Methods  override public void HandleRequest( int request )  {    if( request >= 0 && request < 10 )      Console.WriteLine("{0} handled request {1}",        this, request );    else      if( successor != null )      successor.HandleRequest( request );  }}// "ConcreteHandler2"class ConcreteHandler2 : Handler{  // Methods  override public void HandleRequest( int request )  {    if( request >= 10 && request < 20 )      Console.WriteLine("{0} handled request {1}",        this, request );    else      if( successor != null )      successor.HandleRequest( request );  }}// "ConcreteHandler3"class ConcreteHandler3 : Handler{  // Methods  override public void HandleRequest( int request )  {    if( request >= 20 && request < 30 )      Console.WriteLine("{0} handled request {1}",        this, request );    else      if( successor != null )      successor.HandleRequest( request );  }}/// /// Client test/// public class Client{  public static void Main( string[] args )  {    // Setup Chain of Responsibility    Handler h1 = new ConcreteHandler1();    Handler h2 = new ConcreteHandler2();    Handler h3 = new ConcreteHandler3();    h1.SetSuccessor(h2);    h2.SetSuccessor(h3);    // Generate and process request    int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };    foreach( int request in requests )      h1.HandleRequest( request );  }}

4. 模式应用

你可能感兴趣的文章
北京联通华为光猫HG8346R破解改桥接
查看>>
python使用win32*模块模拟人工操作——城通网盘下载器(一)
查看>>
python append 与浅拷贝
查看>>
Matlab与CUDA C的混合编程配置出现的问题及解决方案
查看>>
2017阿里内推笔试题--算法工程师(运筹优化)
查看>>
python自动化工具之pywinauto(零)
查看>>
python自动化工具之pywinauto(四)——批量转换exe视频
查看>>
python一句话之利用文件对话框获取文件路径
查看>>
PaperDownloader——文献命名6起来
查看>>
PaperDownloader 1.5.1——更加人性化的文献下载命名解决方案
查看>>
如何将PaperDownloader下载的文献存放到任意位置
查看>>
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
系统架构:Web应用架构的新趋势---前端和后端分离的一点想法
查看>>
JVM最简生存指南
查看>>
漂亮的代码,糟糕的行为——解决Java运行时的内存问题
查看>>
Java的对象驻留
查看>>
自己动手写GC
查看>>
Java 8新特性终极指南
查看>>
logback高级特性使用(二) 自定义Pattern模板
查看>>
JVM 线程堆栈分析过程详解
查看>>