原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

[索引页][源码下载]

乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

作者:webabcd





介绍

为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。





示例

有一个Message实体类,某个类对它的操作有Insert()方法。现在要求根据插入信息的字符长度,让不同的对象去处理,这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。







MessageModel

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.ChainOfResponsibility

{

    /**//// <summary>

    /// Message实体类

    /// </summary>

    public class MessageModel

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="msg">Message内容</param>

        /// <param name="pt">Message发布时间</param>

        public MessageModel(string msg, DateTime pt)

        {

            this._message = msg;

            this._publishTime = pt;

        }



        private string _message;

        /**//// <summary>

        /// Message内容

        /// </summary>

        public string Message

        {

            get { return _message; }

            set { _message = value; }

        }



        private DateTime _publishTime;

        /**//// <summary>

        /// Message发布时间

        /// </summary>

        public DateTime PublishTime

        {

            get { return _publishTime; }

            set { _publishTime = value; }

        }

    }

}

SqlMessage

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.ChainOfResponsibility

{

    /**//// <summary>

    /// Sql方式操作Message

    /// </summary>

    public class SqlMessage

    {

        /**//// <summary>

        /// 插入Message

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        /// <returns></returns>

        public bool Insert(MessageModel mm)

        {

            // 代码略

            return true;

        }

    }

}

AbstractExecutor

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.ChainOfResponsibility

{

    /**//// <summary>

    /// 抽象处理者(Handler)角色

    /// </summary>

    public abstract class AbstractExecutor

    {

        /**//// <summary>

        /// 抽象处理者(Handler)角色

        /// </summary>

        protected AbstractExecutor _executor;



        /**//// <summary>

        /// 设置责任链的上一级对象

        /// </summary>

        /// <param name="executor"></param>

        public void SetSuccessor(AbstractExecutor executor)

        {

            this._executor = executor;

        }



        /**//// <summary>

        /// 插入Message

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        /// <returns>执行者;内容;时间</returns>

        public abstract string Insert(MessageModel mm);

    }

}

Employee

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.ChainOfResponsibility

{

    /**//// <summary>

    /// 具体处理者(ConcreteHandler)角色

    /// </summary>

    public class Employee : AbstractExecutor

    {

        /**//// <summary>

        /// 插入Message

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        /// <returns>执行者;内容;时间</returns>

        public override string Insert(MessageModel mm)

        {

            string rtn = "";



            // 插入的信息字符数小于5

)

            {

                SqlMessage m = new SqlMessage();



                if (m.Insert(mm))

                {

                    rtn = "执行者:雇员" + " 内容:" + mm.Message + " 时间:" + mm.PublishTime.ToString();

                }

            }

            // 否则让上级去执行

            else if (base._executor != null)

            {

                rtn = _executor.Insert(mm);

            }



            return rtn;

        }

    }

}

Leader

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.ChainOfResponsibility

{

    /**//// <summary>

    /// 抽象处理者(Handler)角色

    /// </summary>

    public class Leader : AbstractExecutor

    {

        /**//// <summary>

        /// 插入Message

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        /// <returns>执行者;内容;时间</returns>

        public override string Insert(MessageModel mm)

        {

            string rtn = "";



            // 插入的信息字符数小于10

)

            {

                SqlMessage m = new SqlMessage();



                if (m.Insert(mm))

                {

                    rtn = "执行者:主管" + " 内容:" + mm.Message + " 时间:" + mm.PublishTime.ToString();

                }

            }

            // 否则让上级去执行

            else if (base._executor != null)

            {

                rtn = _executor.Insert(mm);

            }



            return rtn;

        }

    }

}

Manager

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.ChainOfResponsibility

{

    /**//// <summary>

    /// 抽象处理者(Handler)角色

    /// </summary>

    public class Manager : AbstractExecutor

    {

        /**//// <summary>

        /// 插入Message

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        /// <returns>执行者;内容;时间</returns>

        public override string Insert(MessageModel mm)

        {

            string rtn = "";



            // 插入的信息字符数小于15

)

            {

                SqlMessage m = new SqlMessage();



                if (m.Insert(mm))

                {

                    rtn = "执行者:经理" + " 内容:" + mm.Message + " 时间:" + mm.PublishTime.ToString();

                }

            }

            else

            {

                rtn = "你所插入的Message不符合要求";

            }



            return rtn;

        }

    }

}

client

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;



using Pattern.ChainOfResponsibility;



public partial class ChainOfResponsibility : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        AbstractExecutor employee = new Employee();

        AbstractExecutor leader = new Leader();

        AbstractExecutor manager = new Manager();

        employee.SetSuccessor(leader);

        leader.SetSuccessor(manager);



        Response.Write(employee.Insert(new MessageModel("abcd", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(employee.Insert(new MessageModel("abcdefgh", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(employee.Insert(new MessageModel("abcdefghigkl", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(employee.Insert(new MessageModel("abcdefghigklmnop", DateTime.Now)));

    }

}

运行结果

执行者:雇员 内容:abcd 时间:2007-4-22 20:04:41

执行者:主管 内容:abcdefgh 时间:2007-4-22 20:04:41

执行者:经理 内容:abcdefghigkl 时间:2007-4-22 20:04:41

你所插入的Message不符合要求





参考

http://www.dofactory.com/Patterns/PatternChain.aspx





OK

[源码下载]

乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)的更多相关文章

  1. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  2. C#设计模式-责任链模式(Chain of Responsibility Pattern)

    引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...

  3. 23种设计模式--责任链模式-Chain of Responsibility Pattern

    一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...

  4. [设计模式] 13 责任链模式 Chain of Responsibility

    转    http://blog.csdn.net/wuzhekai1985   http://www.jellythink.com/archives/878 向项目经理提交了休假申请,我的项目经理向 ...

  5. 设计模式 笔记 责任链模式 chain of responsibility

    //---------------------------15/04/25---------------------------- //Chain of responsibility 责任链----- ...

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

    责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...

  7. 责任链模式-Chain of Responsibility(Java实现), 例2

    责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...

  8. 责任链模式-Chain of Responsibility(Java实现), 例1

    责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...

  9. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

随机推荐

  1. EF中的事务处理的初步理解

    http://yanwushu.byethost7.com/?p=87 1. EF对事务进行了封装:context的saveChange()是有事务性的. 2. 依赖多个不同的Context的操作(即 ...

  2. 模拟spring框架注入实现原理

    这个我是参见了别人的一些东西,不是原创! 定义一些抽象的方法: package com.huxin.springinject.dao; public interface Person { public ...

  3. 杭州电ACM1098——Ignatius&#39;s puzzle

    这个话题.简单的数学. 对于函数,f(x)=5*x^13+13*x^5+k*a*x,输入k,对于休闲x,一个数字的存在a,使f(x)是65可分. 对于休闲x. 因此,当x = 1时间,f(x) = 1 ...

  4. HDU 4916 树分治

    Mart Master II Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. 漫谈并发编程(二):java线程的创建与基本控制

    java线程的创建 定义任务           在java中使用任务这个名词来表示一个线程控制流的代码段,用Runnable接口来标记一个任务,该接口的run方法为线程运行的代码段. public ...

  6. JavaScript模板引擎

    JavaScript模板引擎实例应用   在之前的一篇名为<移动端基于HTML模板和JSON数据的JavaScript交互>的文章中,我向大家说明了为什么要使用JavaScript模板以及 ...

  7. 用Python的Tkinter实现时钟

    import Tkinter,sys,time root=Tkinter.Tk() root.minsize(, ) Label1=Tkinter.Label(text=time.strftime(' ...

  8. c#代码规范和质量检查工具这点事

    c#代码规范和质量检查工具这点事 代码风格检查:StyleCop 代码缺陷检查:FxCop 代码质量: 代码度量值/Code Metrics StyleCop 介绍 The StyleCop tool ...

  9. c++设计模式15 --组合模式

    今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合 ...

  10. Linux内核——定时器和时间管理

    定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理 ...