原文:乐在其中设计模式(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. hdu1428之dfs+spfa

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  2. Visual Prolog 的 Web 专家系统 (8)

    GENI核心 -- 推理引擎(2)流量控制 1.阐述fail."!"而回溯 与其他语言相比,,Prolog最大的特点.这是回溯机制. 回溯机制,还有的主要手段2个月,首先,通过使用 ...

  3. 基于CORS的geoserver同源访问策略

    这个问题理顺整个2天.终于攻克.记录下来. 1.下载文件 首先下载cors压缩包,解压,得到的是org/mortbay/servlets/CrossOriginFilter.class文件,把此文件拷 ...

  4. A Game of Thrones(11) - Daenerys

    Daenerys Targaryen wed Khal Drogo with fear and barbaric([bɑː'bærɪk]野蛮的,粗野的) splendor(光彩:壮丽) in a fi ...

  5. hdu1520(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:举办一个party,候选人当中有很多人之间有上下级关系,求没有直接上下级的最多的人数. 分 ...

  6. 怎样将android studio项目导入eclipse

    如今,越来越多的开源项目都是用android studio来开发的,所以源码都与eclipse有所不同. 以下是将android studio项目导入eclipse的一般步骤: 1. 先解压项目: 2 ...

  7. auto_ptr and scoped_ptr

    #include "boost/scoped_ptr.hpp" #include <iostream> #include <memory>//contain ...

  8. Linux下hp打印机驱动hplip分析

    Hplip分析 版本号是2.14,源代码位置:http://hplipopensource.com. 图的来源:http://hplipopensource.com/node/128. 实践中使用的打 ...

  9. 解决:Could not find debuginfo pkg for dependency package glibc-2.12-1.132.el6_5.3.i686

    场景: (gdb) break main Breakpoint 1 at 0x8048417 (gdb) r Starting program: /usr/local/src/ccode/ch11/s ...

  10. /etc/sysconfig/network-scripts/ifcfg-eth0

    以下各值常见于所有的基本配置文件中:* DEVICE=name,这里name是物理设备的名字(动态分配的PPP设备应当除外,它的名字是“逻辑名”.* IPADDR=addr, 这里addr是IP地址. ...