原文:乐在其中设计模式(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. 【机器学习】SVM核函数

    知识预备 1. 回顾:logistic回归出发,引出了SVM,即支持向量机[续]. 2.  Mercer定理:如果函数K是上的映射(也就是从两个n维向量映射到实数域).那么如果K是一个有效核函数(也称 ...

  2. Exception in thread "http-apr-8080-exec-6" java.lang.OutOfMemoryError: PermGen space 解决!

    Exception in thread "http-apr-8080-exec-6" java.lang.OutOfMemoryError: PermGen space at ja ...

  3. 如何不屏蔽Android系统的返回按键

    比如: 第一种方法: public boolean onKeyDown(int keyCode, KeyEvent event) {         // TODO Auto-generated me ...

  4. C++ Primer笔记7_STL之关联容器

    关联容器 与顺序容器不同,关联容器的元素是按keyword来訪问和保存的.而顺序容器中的元素是按他们在容器中的位置来顺序保存的. 关联容器最常见的是map.set.multimap.multiset ...

  5. 京东商城招聘匹配系统资深工程师 T4级别

    岗位级别:T4 岗位职责: 1.负责匹配系统的架构设计 2.负责网页抽取.实体识别.匹配等算法设计 3.核心代码编写,代码review 任职要求: 1.熟悉机器学习.自然语言处理理论和算法2.三年以上 ...

  6. Unity3D发布WebPlayer时Failed to download data file解决方案

    今天发布WebPlayer时, 发现直接打开html是可以正常运行的, 但是通过iis访问的话就会报错: Failed to download data file. 一开始以为是防火墙, 后来发现不是 ...

  7. 数据库采用多表连接查询,对应javaBean文件连接方式

    在一个Web项目中,只要是存在数据库就一定会有JavaBean文件.一个JavaBean文件会对应一张数据库中的表,供dao中的代码来调用用来存取数据.我们都知道,在数据库设计的时候,如果A.B两张表 ...

  8. ecshop 后台批量上传商品 完整上传

    ecshop 后台批量上传商品,之所以无法上传,是因为后台上传php文件方法中没有导入商品原图路径 将ecshop根目录中的admin/goods_batch.php文件全部修改为 <?php ...

  9. 聊天demo SignalR

    1首先这个demo是针对 net版本是4.5的  SignalR   获取的是2.2的 2新建一个mvc项目 3  Nuget  搜索 SignalR   安装如图的一项 4新建一个 集线器类 修改新 ...

  10. Linux cp -a用法

    对于cp -a最主要的用法是在保留原文件属性的前提下复制文件.其实还有个很好的用法,如下: 大家知道linux下复制目录可以通过,cp -r dirname destdir 但是这样复制的目录属性会发 ...