乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

简介:
[索引页]
[源码下载]


乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)


作者: webabcd


介绍
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。


示例
有一个Message实体类,对它的操作有Get()方法,每次Get()之前要使用ValidateUser()方法来检查当前用户是否有权限,获取数据可能在SqlServer数据库中或Xml文件里。(这里先检查用户的权限,再获取数据就是算法的骨架,获取数据延迟到子类中实现)
 

MessageModel
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace Pattern.TemplateMethod 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// Message实体类 
InBlock.gif         /// </summary> 
InBlock.gif         public  class MessageModel 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="msg">Message内容</param> 
InBlock.gif                 /// <param name="pt">Message发布时间</param> 
InBlock.gif                 public MessageModel( string msg, DateTime pt) 
InBlock.gif                { 
InBlock.gif                         this._message = msg; 
InBlock.gif                         this._publishTime = pt; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  string _message; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Message内容 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  string Message 
InBlock.gif                { 
InBlock.gif                        get {  return _message; } 
InBlock.gif                        set { _message = value; } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private DateTime _publishTime; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Message发布时间 
InBlock.gif                 /// </summary> 
InBlock.gif                 public DateTime PublishTime 
InBlock.gif                { 
InBlock.gif                        get {  return _publishTime; } 
InBlock.gif                        set { _publishTime = value; } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
AbstractMessageTemplate
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace Pattern.TemplateMethod 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 模板方法抽象类 
InBlock.gif         /// </summary> 
InBlock.gif         public  abstract  class AbstractMessageTemplate 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// UserId 
InBlock.gif                 /// </summary> 
InBlock.gif                 protected  string _userId; 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="userId">UserId</param> 
InBlock.gif                 public AbstractMessageTemplate( string userId) 
InBlock.gif                { 
InBlock.gif                         this._userId = userId; 
InBlock.gif                } 
InBlock.gif                
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 验证用户是否合法 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 public  virtual  bool ValidateUser() 
InBlock.gif                { 
InBlock.gif                         if ( this._userId ==  "admin"
InBlock.gif                        { 
InBlock.gif                                 return  true
InBlock.gif                        } 
InBlock.gif                         else 
InBlock.gif                        { 
InBlock.gif                                 return  false
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 获取MessageModel列表 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 public  abstract List<MessageModel> Get(); 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 模板方法:先验证用户是否合法,再获取MessageModel列表 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 public List<MessageModel> TemplateMethodGet() 
InBlock.gif                { 
InBlock.gif                         if (ValidateUser()) 
InBlock.gif                        { 
InBlock.gif                                 return Get(); 
InBlock.gif                        } 
InBlock.gif                         else 
InBlock.gif                        { 
InBlock.gif                                List<MessageModel> l =  new List<MessageModel>(); 
InBlock.gif                                l.Add( new MessageModel( "无权获取", DateTime.Now)); 
InBlock.gif 
InBlock.gif                                 return l; 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
SqlMessage
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace Pattern.TemplateMethod 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// Sql方式操作Message 
InBlock.gif         /// </summary> 
InBlock.gif         public  class SqlMessage : AbstractMessageTemplate 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="userId">UserId</param> 
InBlock.gif                 public SqlMessage( string userId) 
InBlock.gif                        :  base(userId) 
InBlock.gif                {    
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 获取Message 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 public  override List<MessageModel> Get() 
InBlock.gif                { 
InBlock.gif                        List<MessageModel> l =  new List<MessageModel>(); 
InBlock.gif                        l.Add( new MessageModel( "SQL方式获取Message", DateTime.Now)); 
InBlock.gif 
InBlock.gif                         return l; 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
XmlMessage
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif namespace Pattern.TemplateMethod 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// Xml方式操作Message 
InBlock.gif         /// </summary> 
InBlock.gif         public  class XmlMessage : AbstractMessageTemplate 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="userId">UserId</param> 
InBlock.gif                 public XmlMessage( string userId) 
InBlock.gif                        :  base(userId) 
InBlock.gif                { 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 获取Message 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 public  override List<MessageModel> Get() 
InBlock.gif                { 
InBlock.gif                        List<MessageModel> l =  new List<MessageModel>(); 
InBlock.gif                        l.Add( new MessageModel( "XML方式获取Message", DateTime.Now)); 
InBlock.gif 
InBlock.gif                         return l; 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
client
InBlock.gif using System; 
InBlock.gif using System.Data; 
InBlock.gif using System.Configuration; 
InBlock.gif using System.Collections; 
InBlock.gif using System.Web; 
InBlock.gif using System.Web.Security; 
InBlock.gif using System.Web.UI; 
InBlock.gif using System.Web.UI.WebControls; 
InBlock.gif using System.Web.UI.WebControls.WebParts; 
InBlock.gif using System.Web.UI.HtmlControls; 
InBlock.gif 
InBlock.gif using Pattern.TemplateMethod; 
InBlock.gif 
InBlock.gif public partial  class TemplateMethod : System.Web.UI.Page 
InBlock.gif
InBlock.gif         protected  void Page_Load( object sender, EventArgs e) 
InBlock.gif        { 
InBlock.gif                AbstractMessageTemplate m =  new XmlMessage( "user"); 
InBlock.gif                Response.Write(m.TemplateMethodGet()[0].Message +  " " + m.TemplateMethodGet()[0].PublishTime.ToString()); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif 
InBlock.gif                m =  new SqlMessage( "admin"); 
InBlock.gif                Response.Write(m.TemplateMethodGet()[0].Message +  " " + m.TemplateMethodGet()[0].PublishTime.ToString()); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif        } 
InBlock.gif}
 
 
运行结果
无权获取 2007-3-13 22:29:55
SQL方式获取Message 2007-3-13 22:29:55


参考
http://www.dofactory.com/Patterns/PatternTemplate.aspx


OK
[源码下载]
 




     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/344588,如需转载请自行联系原作者


相关文章
|
3月前
|
设计模式 算法 Java
行为型设计模式-策略模式(Strategy Pattern)
行为型设计模式-策略模式(Strategy Pattern)
|
4月前
|
设计模式 算法
二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
|
3月前
|
设计模式 算法
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
38 1
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
|
3月前
|
设计模式 Java 应用服务中间件
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
30 1
|
3月前
|
设计模式 缓存 安全
设计模式 - 创建型模式_ 单例模式 Singleton Pattern
设计模式 - 创建型模式_ 单例模式 Singleton Pattern
39 0
|
3天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
11 1
|
5天前
|
设计模式 算法 Java
小谈设计模式(11)—模板方法模式
小谈设计模式(11)—模板方法模式
|
8天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
11 0
|
1月前
|
设计模式 存储 算法
【设计模式】模板方法模式
【设计模式】模板方法模式
|
1月前
|
设计模式 算法 Java
【设计模式】springboot3项目整合模板方法深入理解设计模式之模板方法(Template Method)
【设计模式】springboot3项目整合模板方法深入理解设计模式之模板方法(Template Method)