二十四种设计模式:模板方法模式(Template Method Pattern)
模板方法模式(Template Method Pattern)
介绍
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。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
二十四种设计模式:模板方法模式(Template Method Pattern)的更多相关文章
- 设计模式 - 模板方法模式(template method pattern) 具体解释
模板方法模式(template method pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template metho ...
- 设计模式 - 模板方法模式(template method pattern) JFrame 具体解释
模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(templ ...
- 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释
模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(tem ...
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 模板方法模式(Template Method Pattern)——复杂流程步骤的设计
模式概述 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单. 在 ...
- 二十四种设计模式:工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...
- 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)
今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...
- 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...
- java设计模式 模板方法模式Template Method
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...
随机推荐
- NOIP 2013 day2
tags: 模拟 贪心 搜索 动态规划 categories: 信息学竞赛 总结 积木大赛 花匠 华容道 积木大赛 Solution 发现如果一段先单调上升然后在单调下降, 那么这一块的代价是最高的减 ...
- MySQL的七种join
转载 原文地址 建表 在这里我们先建立两张有外键关联的两张表: CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`tbl_dept` ...
- SQL Server 用链接服务器 同步SqlServer与MySQL
=======================================================================================SQL SERVER链接S ...
- AC日记——[SDOI2009]HH去散步 洛谷 P2151
[SDOI2009]HH去散步 思路: 矩阵快速幂递推(类似弗洛伊德): 给大佬跪烂-- 代码: #include <bits/stdc++.h> using namespace std; ...
- lr_Analysis Options选项介绍
- 乱侃OOD
接口代表的就是共同性,所谓面向接口编程,就是要抽象各种不同概念的共同点 然后把这些概念的不同点用具体的类包装起来,这样一看,面向接口编程就等于面向对象编程 其实说白了是一个概念 IOC就是要把对细节的 ...
- 【转载】万能adapter
adapter总是自己写,其实使用现成的框架会节省不少代码 原文地址:https://github.com/hongyangAndroid/baseAdapter base-adapter Andro ...
- luogu P1047 校门外的树
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...
- [BZOJ4765]普通计算姬(分块+树状数组)
4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 1725 Solved: 376[Submit][Status][Discus ...
- 【数论】【二次剩余】【map】hdu6128 Inverse of sum
部分引用自:http://blog.csdn.net/v5zsq/article/details/77255048 所以假设方程 x^2+x+1=0 在模p意义下的解为d,则答案就是满足(ai/aj) ...