原文:乐在其中设计模式(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. A Game of Thrones(18) - Catelyn

    “We will make King’s Landing within the hour.” Catelyn turned away from the rail and forced herself ...

  2. hdu1532(最大流)

    传送门:Drainage Ditches 题意:给出n个河流,m个点,以及每个河流的流量,求从1到m点的最大流量. 分析:网络流入门题,第一次写按照白书上毫无优化的Ford_fulkerson算法,先 ...

  3. SSH WebShell: SSH在线WEB管理器安装教程 - VPS管理百科

    SSH WebShell: SSH在线WEB管理器安装教程 - VPS管理百科 SSH WebShell: SSH在线WEB管理器安装教程 本站原创 [基于 署名-非商业使用-相同方式分享 2.5 协 ...

  4. poj1836--Alignment(dp,最长上升子序列变形)

    Alignment Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13319   Accepted: 4282 Descri ...

  5. Codeforces 196 C. Paint Tree

    分治.选最左上的点分给根.剩下的极角排序后递归 C. Paint Tree time limit per test 2 seconds memory limit per test 256 megaby ...

  6. HDU 4869 Turn the pokers(推理)

    HDU 4869 Turn the pokers 题目链接 题意:给定n个翻转扑克方式,每次方式相应能够选择当中xi张进行翻转.一共同拥有m张牌.问最后翻转之后的情况数 思路:对于每一些翻转,假设能确 ...

  7. 深入了解java同步、锁紧机构

    该薄膜还具有从本文试图一个高度来认识我们共同的同步(synchronized)和锁(lock)机制. 我们假定读者想了解更多的并发知识推荐一本书<java并发编程实战>,这是一个经典的书, ...

  8. WCF之添加自定义用户名密码认证

    1.创建WCF服务应用以及调用客户端(请自行google).  2.创建X509证书       cmd 进入  C:\Program Files\Microsoft SDKs\Windows\v6. ...

  9. Cocos2d-x发展---更改父的颜色、透明度的子节点上

    标题手段:当我们改变父节点或透明时的颜色.默认是不会影响孩子的节点. 作为交换组看到朋友说可以通过设置相关的参数变化的子节点来实现属性的效果,看了看源代码,记录下来:        引擎版本号为:2. ...

  10. AE+SceneControl源代码共享

    近来的,博友发私信或邮件交换,第一次使用前SceneControl代做一点project股票,做的很粗糙.我们希望对大家有帮助,欢迎留言交流哈萨克斯坦. 除了主开.保存.数据加载.询价,几个功能主要是 ...