• 乐在其中设计模式(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
    [源码下载]
  • 相关阅读:
    Lesson_6 作业_1 封装学生类
    Lesson_6_1 上课笔记 张三和法拉利
    Lesson_3 作业_3 输出字母金字塔
    Java简介
    Lesson_7 上课笔记_1 static关键字和导包
    软件设计师考试大纲
    <<设计模式可复用面向对象软件的基础>>组合模式(Composite)
    CS1595:已在多处定义
    <<设计模式可复用面向对象软件的基础>>读书笔记(第一章)引言
    <<设计模式可复用面向对象软件的基础>>设计模式怎样解决设计问题
  • 原文地址:https://www.cnblogs.com/webabcd/p/723054.html
Copyright © 2020-2023  润新知