您的位置:首页 > 编程语言 > C#

乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

2007-04-22 20:27 513 查看
[索引页]
[源码下载]

[align=center]乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)[/align]

作者: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
[源码下载]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息