原文:乐在其中设计模式(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
            if (mm.Message.Length < 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
            if (mm.Message.Length < 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
            if (mm.Message.Length < 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. 责任链模式(Chain of Responsibility)

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

  3. 责任链模式 Chain of Responsibility

    责任链模式是一种设计模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最 ...

  4. [设计模式-行为型]责任链模式(Chain of Responsibility)

    概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一 ...

  5. java 事件链_Java设计模式——责任链模式(Chain of Responsibility)

    责任链 责任链模式通俗来说就是关联一串能够处理事务的对象,使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. ...

  6. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 十八、责任链模式 ( Chain of Responsibility)

    责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链 责任链模式给予请求的类型,对请求的发送者和接收者进行解耦 责任链模式中通常每个接收者都包含对 ...

  8. 『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路

    23种设计模式+额外常用设计模式汇总 (持续更新) 问题抽象 客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的. 对于客户端而言,无所谓谁来处理,反正有对象处理就 ...

  9. 37职责链模式(Chain of Responsibility Pattern)

    动机(Motivate):     在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合.     如何使请求的 ...

最新文章

  1. 大咖来信|浪潮刘军:AI计算将成为“新基建”核心支撑之一
  2. 【kafka】confluent_kafka重置offset
  3. CUDA学习-函数前缀__global__
  4. Android--解析XML之SAX
  5. 关于使用ajax给全局变量赋值失败的问题
  6. 前端防xss攻击(去掉空格等能影响和攻击数据库的字段)
  7. php if 单行,php – 单行if语句或if语句没有大括号坏习惯?
  8. PHP 基本语法,变量
  9. 如何利用开源项目,帮助企业免费搭建小程序官网
  10. UCLA博士带入门:室内场景下智能机器人的环境感知及定位
  11. 13 款高逼格且实用的 Linux 运维必备工具
  12. generatorConfig.xml头文件报红
  13. int转字符串_python3基础01数值和字符串(一)
  14. VMware Cloud Director Availability 4.0 百度网盘 下载
  15. 关于Cisco ASDM中配置STATIC NAT顺序的问题-By 年糕泰迪
  16. Python爬虫初学(3)登陆武汉理工大学教务处
  17. ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated
  18. linux系统怎么安装office软件,如何在Linux上安装Microsoft Office | MOS86
  19. Android 防火墙 知乎,知乎客户端下午瘫痪,都是第三方防火墙变更害的
  20. 《编码的奥秘》之手电筒剖析

热门文章

  1. 武林外传辅助工具详细制作过程[第二篇:查看数据]
  2. Metasploit设置HttpTrace参数技巧
  3. 小型Web应用扫描工具Grabber
  4. 外卖行业现状分析_2019年中国外卖行业市场现状与发展趋势分析 用户市场渐趋下沉【组图】...
  5. python依赖平台吗_Python学习之==有依赖关系的接口开发
  6. qgc地面站如何导入离线地图_QGC地面站工具下载 QGroundControl(QGC地面站软件) v2018.11.02 免费安装版 下载-脚本之家...
  7. python中torch模块下载,Python qtorch包_程序模块 - PyPI - Python中文网
  8. 2021 CCF颁奖典礼隆重举行
  9. 阿里AI大牛聂再清重返清华,加入张亚勤AIR战队,说“阿里很支持为国家培养人才”...
  10. AI性能基准测试从此有了「中国标准」!英伟达、谷歌可以试试这套算力卷