微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设计模式 - Template Method Pattern(模板方法模式)

[源码下载]


设计模式 - Template Method Pattern(模板方法模式)


作者: webabcd


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


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




MessageModel

using  System;

using  System.Collections.Generic;

using  System.Text;


namespace  Pattern.TemplateMethod

{

    
/// <summary>

    
/// Message实体类

    
/// </summary>

    public class MessageModel

    
{

        
/// <summary>

        
/// 构造函数

        
/// </summary>

        
/// <p@R_502_6460@m name="msg">Message内容</p@R_502_6460@m>

        
/// <p@R_502_6460@m name="pt">Message发布时间</p@R_502_6460@m>

        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

        
{

@H_56_502@

            
get return _publishTime; }

            
set { _publishTime = value; }

        }

    }

}


AbstractMessageTemplate

using  System;

using  System.Collections.Generic;

using  System.Text;


namespace  Pattern.TemplateMethod

{

    
/// <summary>

    
/// 模板方法抽象类

    
/// </summary>

    public abstract class AbstractMessageTemplate

    
{

        
/// <summary>

        
/// UserId

        
/// </summary>

        protected string _userId;


        
/// <summary>

        
/// 构造函数

        
/// </summary>

        
/// <p@R_502_6460@m name="userId">UserId</p@R_502_6460@m>

        public AbstractMessageTemplate(string userId)

        
{

            
this._userId = userId;

        }

       

        
/// <summary>

        
/// 验证用户是否合法

        
/// </summary>

        
/// <returns></returns>

        public virtual bool ValidateUser()

        
{

            
if (this._userId == "admin")

            
{

                
return true;

            }

            
else

            
{

                
return false;

            }

        }


        
/// <summary>

        
/// 获取MessageModel列表

        
/// </summary>

        
/// <returns></returns>

        public abstract List<MessageModel> Get();


        
/// <summary>

        
/// 模板方法:先验证用户是否合法,再获取MessageModel列表

        
/// </summary>

        
/// <returns></returns>

        public List<MessageModel> TemplateMethodGet()

        
{

            
if (ValidateUser())

            
{

                
return Get();

            }

            
else

            
{

                List
<MessageModel> l = new List<MessageModel>();

                l.Add(
new MessageModel("无权获取", DateTime.Now));


                
return l;

            }

        }

    }

}


sqlMessage

using  System;

using  System.Collections.Generic;

using  System.Text;


namespace  Pattern.TemplateMethod

{

    
/// <summary>

    
/// sql方式操作Message

    
/// </summary>

    public class sqlMessage : AbstractMessageTemplate

    
{

        
/// <summary>

        
/// 构造函数

        
/// </summary>

        
/// <p@R_502_6460@m name="userId">UserId</p@R_502_6460@m>

        public sqlMessage(string userId)

            : 
base(userId)

        

        }


        
/// <summary>

        
/// 获取Message

        
/// </summary>

        
/// <returns></returns>

        public override List<MessageModel> Get()

        
{

            List
<MessageModel> l = new List<MessageModel>();

            l.Add(
new MessageModel("sql方式获取Message", DateTime.Now));


            
return l;

        }

    }

}


XmlMessage

using  System;

using  System.Collections.Generic;

using  System.Text;


namespace  Pattern.TemplateMethod

{

    
/// <summary>

    
/// Xml方式操作Message

    
/// </summary>

    public class XmlMessage : AbstractMessageTemplate

    
{

        
/// <summary>

        
/// 构造函数

        
/// </summary>

        
/// <p@R_502_6460@m name="userId">UserId</p@R_502_6460@m>

        public XmlMessage(string userId)

            : 
base(userId)

        
{

        }


        
/// <summary>

        
/// 获取Message

        
/// </summary>

        
/// <returns></returns>

        public override List<MessageModel> Get()

        
{

            List
<MessageModel> l = new List<MessageModel>();

            l.Add(
new MessageModel("XML方式获取Message", DateTime.Now));


            
return l;

        }

    }

}



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.TemplateMethod;


public  partial  class  TemplateMethod : System.Web.UI.Page

{

    
protected void Page_Load(object sender, EventArgs e)

    
{

        AbstractMessageTemplate m 
= new XmlMessage("user");

        Response.Write(m.TemplateMethodGet()[
0].Message + " " + m.TemplateMethodGet()[0].PublishTime.ToString());

        Response.Write(
"<br />");


        m 
= new sqlMessage("admin");

        Response.Write(m.TemplateMethodGet()[
0].Message + " " + m.TemplateMethodGet()[0].PublishTime.ToString());

        Response.Write(
"<br />");

    }

}


运行结果
无权获取 2007-3-13 22:29:55
sql方式获取Message 2007-3-13 22:29:55


OK
[源码下载]
 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐