原文:乐在其中设计模式(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()[].PublishTime.ToString());

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



        m = new SqlMessage("admin");

        Response.Write(m.TemplateMethodGet()[].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

[源码下载]

乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)的更多相关文章

  1. 二十四种设计模式:模板方法模式(Template Method Pattern)

    模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...

  2. 设计模式 - 模板方法模式(template method pattern) JFrame 具体解释

    模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(templ ...

  3. 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释

    模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(tem ...

  4. 设计模式 - 模板方法模式(template method pattern) 具体解释

    模板方法模式(template method pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template metho ...

  5. 模板方法模式(Template Method Pattern)——复杂流程步骤的设计

    模式概述 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单. 在 ...

  6. 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)

    今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...

  7. java_设计模式_模板方法模式_Template Method Pattern(2016-08-11)

    定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.这里的算法的结构,可以理解为你根据需求设计出来的业务流程.特定的步骤就是指那些 ...

  8. 模板方法模式(Template Method Pattern)

    模板方法模式是一种基于继承的代码复用技术,定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤. 模式中的角色 抽象类(Abstrac ...

  9. 使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)

    本文的概念内容来自深入浅出设计模式一书. 项目需求 有一家咖啡店, 供应咖啡和茶, 它们的工序如下: 咖啡: 茶: 可以看到咖啡和茶的制作工序是差不多的, 都是有4步, 其中有两步它们两个是一样的, ...

随机推荐

  1. freemarker自己定义标签(二)

    freemarker自己定义标签 1.自己定义标签 通过自己定义标签,写一个反复指定字符串 2.实现源代码 <html> <head> <meta http-equiv= ...

  2. Android清理设备内存具体完整演示样例(一)

    MainActivity例如以下: package come.on; import android.app.Activity; import android.content.Context; impo ...

  3. MSF 离线攻击

    MSF 离线攻击 MSF连环攻击在internet上实现是不太现实的,网络中的安全设备(防火墙.入侵检测.入侵防护系统). 实验拓扑如下: 实验说明:安全实验中的包过滤防火墙在测试中使用的是linux ...

  4. poj1651(区间dp)

    题目连接:http://poj.org/problem?id=1651 题意:给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积.直到只剩下首尾两个数 ...

  5. Amazon S3数据一致性模型

    左右Amazon S3有两种类型的数据的一致性模型的: 最后,一致性和读一致性. 有下面几种行为: 1 写一个新的object,然后開始读它.直到全部的变化都传播完(副本),你才干读到它,否则就是ke ...

  6. hdu 4961 Boring Sum(数学题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4961 Problem Description Number theory is interesting ...

  7. 《软件project》课程报告 —国土资源执法监察管理信息系统建模

    ***********************************************声明*************************************************** ...

  8. SWT的CheckBoxTreeView的上级菜单与下级菜单的选中的实现

    是不是很神奇? treeViewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStat ...

  9. HDU 3315 My Brute(费用流)

    职务地址:HDU 3315 这个题的思路全然是自己想出来的,自我感觉挺巧妙的. . .(大牛勿喷.. . )对大胆建图又多了一份信心. 详细思路是构造一个二分图,Si连源点.Xi连汇点,流量都是1,费 ...

  10. winfrom 倒计时控件

    最近在做一个快递柜项目,要求在用户没有操作的时间到了一分钟,自动返回主页,我于是封装了一个倒计时控件,废话少说,直接上代码 public partial class RemainingTimeUC : ...