原文:乐在其中设计模式(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. 无需安装Mono的Jexus

    ASP.NET跨平台实践:无需安装Mono的Jexus“独立版”   在Linux上运行ASP.NET网站或WebApi的传统步骤是,先安装libgdiplus,再安装mono,然后安装Jexus.在 ...

  2. Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration

    Installing and setting up Oracle GoldenGate connecting to an Oracle database Also please make sure t ...

  3. UIImagePickerController本地化控件文字

    在使用UIImagePickerController时候,你会发如今选择照片或者拍照的时候,界面的很多控件都是英文的,比方"Cancel","Choose"等. ...

  4. 2014-5-22 java.lang.OutOfMemoryError: Java heap space的一次诊断

    收到消息某系统一个节点因为内存溢出而宕机.系统的中间件是weblogic.数据库的oracle. 1. 先用IBM  HeapAnalyzer分析内存溢出时的dump文件,找到占用内存最多的请求,然后 ...

  5. aix 下 实现goldengate 随os启动而自己主动启动的脚本

    aix 下 实现goldengate 随os启动而自己主动启动的脚本: 1.用oracle用户建立/u01/info.txt,文件内容例如以下: sh date start mgr 2.chmod + ...

  6. windows 2003 自动安全设置

    @echo offecho.echo.echo.echo 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓echo.echo.echo windows 2003 自动安全设置程序 echo. ec ...

  7. 2014年辛星解读Javascript之用DOM动态操纵HTML元�

    关于DOM,我们了解了能够用DOM操纵HTML的一些属性和样式,还能够为HTML元素绑定事件等等,那么接下来,我们将涉及到用DOM来动态的创建.删除HTML等一些操作,我的核心思路还是重实战,因此,代 ...

  8. Django写的投票系统1(转)

    当然主要是从django的帮助文档里面来的,权当是翻译吧 这个投票系统的主要功能有 1.一个前台页面,可以让用户来投票 2.一个管理员页面,可以用来添加.修改.删除投票 首页第一步要确定你已经安装了D ...

  9. 9个杀手级 JVM 编程语言

    9个杀手级 JVM 编程语言 Java虚拟机已经不再是仅仅局限在 Java 了,很多语言提供了脚本转换,可以让其他的程序在java虚拟机上运行,这样能够让更多的开发者能够依靠JVM在Java平台上大有 ...

  10. poj3468(线段树)

    题目连接:http://poj.org/problem?id=3468 线段树功能:update:成段增减 query:区间求和. 分析:需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候 ...