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


    [索引页]
    [源码下载]


    乐在其中设计模式(C#) - 模板方法模式(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>
            
    /// <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; }
            }

        }

    }


    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>
            
    /// <param name="userId">UserId</param>

            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>
            
    /// <param name="userId">UserId</param>

            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>
            
    /// <param name="userId">UserId</param>

            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


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


    OK
    [源码下载]
  • 相关阅读:
    围棋GO
    Android 四大组件------Activity
    android studio----设备兼容
    android UI开发--------Action Bar
    开发调试工具----DDMS
    RxJava的使用
    Atlas框架
    Android studio上git的使用
    AS上git的使用与遇到的问题
    picasso-安卓的图片下载缓存库
  • 原文地址:https://www.cnblogs.com/webabcd/p/673658.html
Copyright © 2020-2023  润新知