C#设计模式系列:职责链模式(Chain of Responsibility)
1、职责链模式简介
1.1>、定义
职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求。将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
1.2>、使用频率
中低
2、职责链模式结构
2.1>、结构图

2.2>、参与者
职责链模式参与者:
◊ Handler
° 定义一个处理请求的接口
° 实现后继链
◊ ConcreteHandler
° 处理其所负责的请求
° 可访问其后继者
° 如果可处理该请求,则处理;否则将该请求转发给它的后继者。
◊ Client:向链上的具体处理者对象提交请求
在职责链模式中,Client向Handler提交请求,请求在多个ConcreteHandler对象形成的对象链中被传递,请求在传递的过程中被处理。
3、职责链模式结构实现

Handler.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
{
public abstract class Handler
{
protected Handler successor; public void SetSuccessor(Handler successor)
{
this.successor = successor;
} public abstract void HandleRequest(int request);
}
}
ConcreteHandler1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
{
public class ConcreteHandler1 : Handler
{
public override void HandleRequest(int request)
{
if (request >= && request < )
{
Console.WriteLine("{0} handled request {1}", this.GetType().Name, request);
} else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
}
ConcreteHandler2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
{
public class ConcreteHandler2 : Handler
{
public override void HandleRequest(int request)
{
if (request >= && request < )
{
Console.WriteLine("{0} handled request {1}", this.GetType().Name, request);
} else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
}
ConcreteHandler3.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
{
public class ConcreteHandler3 : Handler
{
public override void HandleRequest(int request)
{
if (request >= && request < )
{
Console.WriteLine("{0} handled request {1}", this.GetType().Name, request);
} else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.ChainOfResponsibilityPattern.Structural; namespace DesignPatterns.ChainOfResponsibilityPattern
{
class Program
{
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 = { , , , , , , , }; foreach (int request in requests)
{
h1.HandleRequest(request);
}
}
}
}
运行输出:
ConcreteHandler1 handled request
ConcreteHandler1 handled request
ConcreteHandler2 handled request
ConcreteHandler3 handled request
ConcreteHandler2 handled request
ConcreteHandler1 handled request
ConcreteHandler3 handled request
ConcreteHandler3 handled request
请按任意键继续. . .
上例中,ConcreteHandler1负责处理的请求范围0~10,ConcreteHandler2负责处理的请求范围10~20,ConcreteHandler3负责处理的请求范围20~30。当请求ConcreteHandler1处理不了,则让ConcreteHandler2处理,如果ConcreteHandler2处理不了,则让ConcreteHandler3处理。依次类推,Client的请求会验证职责链传递下去,直至请求被处理,而Client不要关心到底是谁处理了请求。
4、职责链模式应用分析
职责链模式适用情形:
1>、可能处理请求的对象集合以及它们在链表中的顺序是由Client根据当前应用的状态在运行时动态决定的;
2>、Client根据状态,对于不同的请求类型,可以拥有不同的可能处理请求的对象集合。一个处理请求的对象也可以根据Client的状态和请求类型,把请求传递给不同的处理对象。
3>、Client初始化请求,或者在不知道这些对象是否能处理这个请求的情况下初始化任何可能处理请求的对象。Client和在处理链表中的处理对象都不需要知道到底哪个对象去处理这个请求。
4>、请求不能保证被处理。在没有处理的情况下,请求已经到达了处理链的表尾。
职责链模式特点:
1>、职责链模式降低了发出命令的对象和处理命令的对象之间的耦合,它允许多于一个的处理者对象根据自己的逻辑来决定哪个处理者最终处理这个命令。发出命令的对象只是把命令传给链结构的起始者,而不需要知道到底是链上的哪一个节点处理了这个命令。这样在处理命令上,允许系统由更多的灵活性。哪一个对象最终处理一个命令可以由那些对象参加职责链,以及随着这些对象在职责链上的位置不同而不同。
2>、既然一个请求没有明确的接收者,那么就不能保证它一定会被处理。该请求可能一直到链的末端都得不到处理。一个请求也可以因该链没有被正确配置而得不到响应,并且处理消息传递和处理不当会出现消息的循环重复执行。
C#设计模式系列:职责链模式(Chain of Responsibility)的更多相关文章
- 设计模式之职责链模式(Chain of Responsibility)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 行为型设计模式之职责链模式(Chain of Responsibility)
结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个 ...
- 设计模式之职责链模式(Chain of Responsibility)
职责链模式原理: 职责链模式和装饰模式以及组合模式类似的地方是都维持着指向父类的指针, 不同点是职责链模式每个子类都继承父类的指针及每个之类都维持着指向父类的指针,而组合模式与装饰模式是组合类鱼装饰类 ...
- atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...
- 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...
- 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)
责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...
- 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...
- 职责链模式(Chain of Responsibility)(对象行为型)
1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- 设计模式:职责链模式(Chain of Responsibility)
去年参加校招要到长沙来,这个对于我来说不是特别喜欢(但又必须的来,谁叫咱不是985.211的娃呢),但是对于某些人来说就是福音了.大四还有课,而且学校抓的比较严,所以对于那些想翘课的人来说这个是最好不 ...
随机推荐
- Holographic Remoting
看到微软官方的 Holographic Remoting Player https://developer.microsoft.com/en-us/windows/holographic/hologr ...
- 基于redis的点赞功能设计
前言 点赞其实是一个很有意思的功能.基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回m ...
- 【读书笔记】《编程珠玑》第一章之位向量&位图
此书的叙述模式是借由一个具体问题来引出的一系列算法,数据结构等等方面的技巧性策略.共分三篇,基础,性能,应用.每篇涵盖数章,章内案例都非常切实棘手,解说也生动有趣. 自个呢也是头一次接触编程技巧类的书 ...
- 关于telnet源码
Linux 下流行的 telnet 实现有两个:GNU 的 inetutils 中的实现哈佛的 netkit-telnet 1. http://ftp.gnu.org/gnu/inetutils/2. ...
- browsersync实现网页实时刷新(修改LESS,JS,HTML时)
var gulp = require("gulp"), less = require("gulp-less"), browserSync = require(& ...
- day 2 Linux基础
6.用户.群组和权限 1) 新建用户natasha,uid为1000,gid为555,备注信息为"master" useradd natasha usermod -u1000 na ...
- WebService的一些案例
既然要实现WebService,首先先来创建一个Service类 package cn.happy.webservice; import javax.jws.WebService; import ja ...
- HTML5、canvas颜色拾取器
效果图: 代码: <!doctype html> <html lang="en"> <head> <meta charset=" ...
- java实现全排列
前天上午的面试遇到了一个用java实现一串数字的全排列的题,想来想去用递归最方便,可是没有在规定的时间内完成555,今天上午有空便继续写,以下是完成后的代码: import java.util.Arr ...
- 搬-Android - Wi-Fi Tutorial[转]
http://www.tutorialspoint.com/android/android_wi_fi.htm Android allows applications to access to vie ...