下面是使用指责链模式的一个具体的实例,可以方便的理解指责链模式。

其实指责链简单的来说,就是把一个指责的流程定义出来,像一条链路一样,每一个结点有自己的处理范围,若不能处理,则传到自己的引用的下一个结点。

下面的实例也是这样的一个简单的流程。每一笔预算需要不同的人审核,不同的人有不同的审核范围,若款项在自己的处理范围之内,就可以直接处理掉,若不在自己的范围内,就传入到自己的上级进行处理。在写实例的时候,就需要用户把处理的过程给定义出来。既是把那条处理的链路定义出来。

下面是示例的源代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Chain_of_Responsibility_Use
{
class PurchaseReuest
{
private int number;
private double amount;
private string purpose; public PurchaseReuest(int number, double amount, string purpose)
{
this.amount = amount;
this.number = number;
this.purpose = purpose;
}
public int Number
{
get { return number; }
set { number = value; }
}
public double Amount
{
get { return amount; }
set { amount = value; }
}
public string Purpose
{
get { return purpose; }
set { purpose = value; }
}
}
abstract class Approver
{
protected string name;
protected Approver successor; public Approver(string name)
{
this.name = name;
}
public void setSuccessor(Approver successor)
{
this.successor = successor;
}
abstract public void ProcessRequest(PurchaseReuest request);
}
//ConcreteHandler
class Director : Approver
{
public Director(string name)
: base(name) { }
public override void ProcessRequest(PurchaseReuest request)
{
//throw new NotImplementedException();
if (request.Amount < 10000.0)
Console.WriteLine("{0} {1} approved request# {2} ", this, name, request.Number);
else
if (successor != null)
successor.ProcessRequest(request);
}
}
//ConcreteHandler
class VicePresident : Approver
{
public VicePresident(string name) : base(name) { }
public override void ProcessRequest(PurchaseReuest request)
{
//throw new NotImplementedException();
if (request.Amount < 25000.0)
Console.WriteLine("{0} {1} approved request# {2} ", this, name, request.Number);
else
if (successor != null)
successor.ProcessRequest(request);
}
}
//ConcreteHandler
class President : Approver
{
public President(string name) : base(name) { }
public override void ProcessRequest(PurchaseReuest request)
{
//throw new NotImplementedException();
if (request.Amount < 100000.0)
Console.WriteLine("{0} {1} approved request# {2} ", this, name, request.Number);
else
Console.WriteLine("Request# {0} request " + "an executie meeting ! ", request.Number);
}
} class Program
{
static void Main(string[] args)
{
Director Larry = new Director("Larry");
VicePresident Sam = new VicePresident("Sam");
President Tammy = new President("Tammy");
Larry.setSuccessor(Sam);
Sam.setSuccessor(Tammy); PurchaseReuest rs = new PurchaseReuest(2034, 350.00, "Supplies");
Larry.ProcessRequest(rs); PurchaseReuest rx = new PurchaseReuest(2035, 12590.10, "Project X");
Larry.ProcessRequest(rx); PurchaseReuest ry = new PurchaseReuest(2036, 122100.00, "Project Y");
Larry.ProcessRequest(ry); Console.ReadKey();
}
}
}

下面是示例的类图:

下面是示例的关系图:

示例的运行截图如下:

职责链模式实例(C#)的更多相关文章

  1. JavaScript实现职责链模式

    什么是职责链模式 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.举个例子:当你从公 ...

  2. 深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)

    模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传 ...

  3. 职责链模式vs状态模式区别

    状态模式在具体状态里设置了下一状态. 而职责链模式是在客户端代码里设置了下一状态的处理对象. 如果状态模式里的任何一环缺失,将导致事情无法进行下去.职责链模式的链式在客户端连接的,也就是说,如果我们请 ...

  4. 设计模式入门之职责链模式Chain Of Responsibility

    //职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. //实例:申请费用的功能,不同金额的费 ...

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

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

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

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

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

    1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...

  8. js原生设计模式——13桥接模式(相同业务逻辑抽象化处理的职责链模式)

    桥接模式之多元化类之间的实例化调用实例 <!DOCTYPE html><html lang="en"><head>    <meta ch ...

  9. Java设计模式之《职责链模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6530089.html 职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形 ...

随机推荐

  1. Android简单的聊天室开发(client与server沟通)

    请尊重他人的劳动成果.转载请注明出处:Android开发之简单的聊天室(client与server进行通信) 1. 预备知识:Tcp/IP协议与Socket TCP/IP 是Transmission ...

  2. ext panel 它们的定义图像刷新

    从管理发展的近期回报.事实上,它采取了一些努力,以适应,应对来自另一个角度的问题只.外观似良好的效果.阿土,项目用到了EXT js.百度大神里面没找到一个合适的图片组件.自己写了个能够刷新的图片组件. ...

  3. Java日期的格式String类型GMT,GST换算成日期Date种类

    请尊重他人的劳动成果.转载请注明出处:Java日期格式化之将String类型的GMT,GST日期转换成Date类型 http://blog.csdn.net/fengyuzhengfan/articl ...

  4. elasticsearch的rest搜索---mapping

    目录: 一.针对这次装B 的解释 二.下载,安装插件elasticsearch-1.7.0   三.索引的mapping 四. 查询 五.对于相关度的大牛的文档 三.mapping 1. 索引的map ...

  5. SharePoint 2013 搜索SharePoint 特定列和特定文档(自己定义搜索)

    SharePoint 2013 搜索SharePoint 特定列和特定文档 1,操作步骤和图例,因语言和版本号的不同 我尽量使用抓图方式. 2.  In Central Administration, ...

  6. MVC使用百度开源文本编辑器UEditor实现图文并茂,字数限制,上传图片或涂鸦

    原文:MVC使用百度开源文本编辑器UEditor实现图文并茂,字数限制,上传图片或涂鸦 文本编辑器有很多,比如ticymce和CKEditor就比较好用,但涉及到图片.文件上传,需要结合CKFinde ...

  7. 用bat启动sqlserver服务

    声明下这个脚本不是我写的,忘了是从哪看到的了,在此分享给大家,因为在我的理解中技术就是用来分享的,,希望原创作者看到了不要介意. 1.创建个文本,将后缀名改成.bat 2.将下边语句粘贴进去,然后保存 ...

  8. 关于ligerform中select与text的赋值与取值

    如有下ligerform表单: var formData = [ { display: "区域", name: "QYYJ", newline: true, l ...

  9. JS中通过call方法实现继承

    原文:JS中通过call方法实现继承 讲解都写在注释里面了,有不对的地方请拍砖,谢谢! <html xmlns="http://www.w3.org/1999/xhtml"& ...

  10. Asterisk 未来之路3.0_0004

    原文:Asterisk 未来之路3.0_0004 Asterisk Wiki   asterisk 的Wiki是很多启迪和困惑的发源地,另外一个最重要的VOIP知识库www.voip-info.org ...