行为型设计模式之职责链模式(Chain of Responsibility)

结构
意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
适用性
  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 可处理一个请求的对象集合应被动态指定。

  1 using System;
  2
  3     abstract class Handler
  4     {
  5         protected Handler successorHandler;
  6         abstract public void HandleRequest(Request request);
  7         public void SetSuccessor(Handler sucessor)
  8         {
  9             successorHandler = sucessor;
 10         }
 11     }
 12
 13     class ConcreteHandler1 : Handler
 14     {
 15         override public void HandleRequest(Request request)
 16         {
 17             // determine if we can handle the request
 18             if (request.RequestType == 1) // some complex decision making!
 19             {
 20                 // request handling code goes here
 21                 Console.WriteLine("request handled in ConcreteHandler1");
 22             }
 23             else
 24             {
 25                 // not handled here - pass on to next in the chain
 26                 if (successorHandler != null)
 27                     successorHandler.HandleRequest(request);
 28             }
 29         }
 30     }
 31
 32     class ConcreteHandler2 : Handler
 33     {
 34         override public void HandleRequest(Request request)
 35         {
 36             // determine if we can handle the request
 37             if (request.RequestType == 2) // some complex decision making!
 38             {
 39                 // request handling code goes here
 40                 Console.WriteLine("request handled in ConcreteHandler2");
 41             }
 42             else
 43             {
 44                 // not handled here - pass on to next in the chain
 45                 if (successorHandler != null)
 46                     successorHandler.HandleRequest(request);
 47             }
 48         }
 49     }
 50
 51     class ConcreteHandler3 : Handler
 52     {
 53         override public void HandleRequest(Request request)
 54         {
 55             // determine if we can handle the request
 56             if (request.RequestType == 3) // some complex decision making!
 57             {
 58                 // request handling code goes here
 59                 Console.WriteLine("request handled in ConcreteHandler3");
 60             }
 61             else
 62             {
 63                 // not handled here - pass on to next in the chain
 64                 if (successorHandler != null)
 65                     successorHandler.HandleRequest(request);
 66             }
 67         }
 68     }
 69
 70     class Request
 71     {
 72         private int iRequestType;
 73         private string strRequestParameters;
 74
 75         public Request(int requestType, string requestParameters)
 76         {
 77             iRequestType = requestType;
 78             strRequestParameters = requestParameters;
 79         }
 80
 81         public int RequestType
 82         {
 83             get
 84             {
 85                 return iRequestType;
 86             }
 87             set
 88             {
 89                 iRequestType = value;
 90             }
 91         }
 92     }
 93
 94     /// <summary>
 95     ///    Summary description for Client.
 96     /// </summary>
 97     public class Client
 98     {
 99         public static int Main(string[] args)
100         {
101             // Set up chain (usually one need to be done once)
102             Handler firstHandler = new ConcreteHandler1();
103             Handler secondHandler = new ConcreteHandler2();
104             Handler thirdHandler = new ConcreteHandler3();
105             firstHandler.SetSuccessor(secondHandler);
106             secondHandler.SetSuccessor(thirdHandler);
107
108             // After setting up the chain of responsibility, we can
109             // now generate requests and pass then off to the
110             // chain to be handled
111
112             // generate and fire request
113             Request newRequest = new Request(2,"This are the request parameters");
114             firstHandler.HandleRequest(newRequest);
115
116             return 0;
117         }
118     }

职责链模式

时间: 2024-10-14 10:30:56

行为型设计模式之职责链模式(Chain of Responsibility)的相关文章

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

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 责任链模式中,每个对象通过持有对下家的引用而链接起来,形成一条链条,串联起来多个处理对象. 在责任链模式中,请求在链上进行传递,直到链上的某一个对象决定处理此请求. 发出这个请求的客户端程序并不知道到底是哪一个对象具体的处理了请求 这使得系统可以在不影响客户

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

1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,并且沿着这条链传递请求,直到有(部门)对象处理它为止. 例子1:js的事件浮升机制 例子2: 2.问题 如果有多个对象都有可能接受请求,如何避免避免请求发送者与接收者耦合在一起呢? 3.解决方案 职责链模式(Ch

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

atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3. 调用代码 2 4. 责任链链的特性: 2 5. 模式结构 4 6. 职责链模式包含如下角色:Handler,ConcreteHandler: 具体处理者,HandlerChainUtil ,Client 4 7. 设置哈一个handler,,两个法:排序法,指定法 5 1. 指定法 5 2. 排

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

 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就推卸给另外个一个部门(对象).至于究竟谁来解决问题呢?政府部门就是为了能够避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,而且沿着这条链传递请求.直到有(部门)对象处理它为止. 样例1:js的事件浮升机制 样例2: 2.问题 假设有多个对象都有

职责链模式(Chain of Responsibility)(对象行为型)

职责链模式(Chain of Responsibility)(对象行为型) :使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.(Avoid coupling the sender of a request to itsreceiver by giving morethan one objecta chance to handle the request.Chain the receiving obje

职责链模式(Chain of Responsibility)

详解 定义 为了避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,职责链模式又称为责任链模式,它是一种对象行为型模式.(如果你接触过异常处理,那么套用异常处理机制可以更好地理解). 职责链可以是一条直线,也可以是一个环,还可以是一个树形结构,不过最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行

设计模式(行为型)之职责链模式(Chain of Responsibility Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之状态模式(State Pattern)>http://blog.csdn.net/yanbober/article/details/45502665 概述 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链

重温设计模式(三)——职责链模式(chain of responsibility)

一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所以希望各位多多指教. 二. 什么是链 文章伊始,先让我们了解这个最基本的概念,什么是链. 我给链下了这样的定义: 1. 链是一系列节点的集合. 2. 链的各节点可灵活拆分再重组. 三. 何为职责链 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条