c#设计模式系列:模板方法模式(Template Method Pattern)
引言
提到模板,大家肯定不免想到生活中的“简历模板”、“论文模板”、“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历。在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概念来理解模板方法的定义。
模板方法介绍
模板方法模式的定义
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模仿方法使得子类可以不改变一个算法的结构既可重定义该算法的某些特定步骤
模仿方法模式的结构图
模式的组成
AbstractClass是抽象类,其实也就是一个抽象模板,定义并实现了一个模板方法,这个模板方法一般是一个具体的方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现,顶级逻辑也有可能调用一些具体的方法
ConcreteClass实现了父类所定义的一个或多个抽象放啊,每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以出这些抽象方法(也就是顶级逻辑的组成步骤)不同的实现,从而使得顶级逻辑的实现各不相同
看了模板方法的定义以及结构图,下面我们来看看在代码中如何使用
题目:要下课了老师在黑板出家庭作业,每个学生都要抄题目。
第一版无模式


/// <summary>
/// 学生甲
/// </summary>
public class MethodA
{
public void TestQuestion1()
{
Console.WriteLine("试题一【】 a.正确 b 错误 c 无解"); Console.WriteLine("答案:b");
} public void TestQuestion2()
{
Console.WriteLine("试题二【】 a.正确 b 错误 c 无解"); Console.WriteLine("答案:a");
} public void TestQuestion3()
{
Console.WriteLine("试题三【】 a.正确 b 错误 c 无解"); Console.WriteLine("答案:c");
}
} /// <summary>
/// 学生已
/// </summary>
public class MethodB
{
public void TestQuestion1()
{
Console.WriteLine("试题一【】 a.正确 b 错误 c 无解"); Console.WriteLine("答案:b");
} public void TestQuestion2()
{
Console.WriteLine("试题二【】 a.正确 b 错误 c 无解"); Console.WriteLine("答案:a");
} public void TestQuestion3()
{
Console.WriteLine("试题三【】 a.正确 b 错误 c 无解"); Console.WriteLine("答案:c");
}
} /// <summary>
/// 客户端
/// </summary>
class Program
{
static void Main(string[] args)
{
Console.WriteLine("学生甲的试题:");
MethodA a = new MethodA();
a.TestQuestion1();
a.TestQuestion2();
a.TestQuestion3(); Console.WriteLine("学生已的试题:");
MethodB B= new MethodB();
B.TestQuestion1();
B.TestQuestion2();
B.TestQuestion3();
}
}
可以看出内容相识度很高,除了答案不同,没什么不一样了,这样的代码容易出错,难以维护,学习了模板方法以后进行改版
第二版


/// <summary>
/// 抽象类
/// </summary>
public abstract class TestQuestion
{
public void TestQuestion1()
{
Console.WriteLine("试题一【】 a.正确 b 错误 c 无解"); Console.WriteLine("答案:"+ Anster1());
}
public void TestQuestion2()
{
Console.WriteLine("试题二【】 a.正确 b 错误 c 无解"); Console.WriteLine("答案:"+Anster2());
} public void TestQuestion3()
{
Console.WriteLine("试题三【】 a.正确 b 错误 c 无解"); Console.WriteLine("答案:"+ Anster3());
}
public virtual string Anster1()
{
return "";
}
public virtual string Anster2()
{
return "";
}
public virtual string Anster3()
{
return "";
}
} /// <summary>
/// 学生甲
/// </summary>
public class MethodA:TestQuestion
{
public override string Anster1()
{
return "a";
}
public override string Anster2()
{
return "b";
}
public override string Anster3()
{
return "c";
}
}
/// <summary>
/// 客户端
/// </summary>
class Program
{
static void Main(string[] args)
{
Console.WriteLine("学生甲的试题:");
TestQuestion a = new MethodA();
a.TestQuestion1();
a.TestQuestion2();
a.TestQuestion3(); }
}
y引入模板方法模式后,代码的可读性增加了,将不变的代码抽象为父类,子类子需要填写答案就行了
模板方法模式的优缺点
优点:
- 实现了代码复用
- 能够灵活应对子步骤的变化,符合开放-封闭原则
缺点:因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。
附:在.NET中模板方法的应用也很多,例如我们在开发自定义的Web控件或WinForm控件时,我们只需要重写某个控件的部分方法
总结
到这里,模板方法的介绍就结束了,模板方法模式在抽象类中定义了算法的实现步骤,将这些步骤的实现延迟到具体子类中去实现,从而使所有子类复用了父类的代码,所以模板方法模式是基于继承的一种实现代码复用的技术。
c#设计模式系列:模板方法模式(Template Method Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 二十四种设计模式:模板方法模式(Template Method Pattern)
模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...
- 设计模式 - 模板方法模式(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 ...
- 设计模式 - 模板方法模式(template method pattern) 具体解释
模板方法模式(template method pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template metho ...
- 模板方法模式(Template Method Pattern)——复杂流程步骤的设计
模式概述 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单. 在 ...
- 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)
今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...
- java_设计模式_模板方法模式_Template Method Pattern(2016-08-11)
定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.这里的算法的结构,可以理解为你根据需求设计出来的业务流程.特定的步骤就是指那些 ...
- 模板方法模式(Template Method Pattern)
模板方法模式是一种基于继承的代码复用技术,定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤. 模式中的角色 抽象类(Abstrac ...
- 使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)
本文的概念内容来自深入浅出设计模式一书. 项目需求 有一家咖啡店, 供应咖啡和茶, 它们的工序如下: 咖啡: 茶: 可以看到咖啡和茶的制作工序是差不多的, 都是有4步, 其中有两步它们两个是一样的, ...
随机推荐
- ios笔试题
最近找工作,有面试有笔试部分,故把笔试题自己整理了下. 面试能力要求:精通iphone的UI开发,能熟练操作复杂表视图,熟练使用图层技术, 可以自定义UI控件,使用类别扩展系统控件功能; 擅长通讯 ...
- 第2章地址Address(WCF全面解析3)
WCF顾明思义,就是在Windows平台下解决通信(C,Communication)的基础框架(F,Foundation)问题. 终结点是WCF最为核心的对象,因为它承载了所有通信功能.服务通过相应的 ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十二周
java学习第十章:图形程序设计 本章,介绍的是如何编写使用图形用户界面GUI的java程序.主要讲的是如何编写定义屏幕上的窗口大小和位置的程序,如何在窗口中采用多种字体显示文本,如何显示 ...
- c# vs c++
[c# vs c++] 1.在 C++ 中,类和结构实际上是相同的,而在 C# 中,它们很不一样.C# 类可以实现任意数量的接口,但只能从一个基类继承.而且,C# Struct不支持继承,也不支持显式 ...
- 03.什么是Lucene全文检索的原理01
全文检索的原理:查询速度快,精准度高,可以根据相关度进行排序.它的原理是:先把内容分词,分词之后建索引. Lucene是apache下的一个开放源代码的全文检索引擎工具包. 提供了完整的查询引擎和索引 ...
- 【SPOJ - LCS2】Longest Common Substring II【SAM】
题意 求出多个串的最长公共子串. 分析 刚学SAM想做这个题的话最好先去做一下那道codevs3160.求两个串的LCS应该怎么求?把一个串s1建自动机,然后跑另一个串s2,然后找出s2每个前缀的最长 ...
- 利用Fiddler对Android模拟器网络请求进行抓包
安装使用Fiddler 下载安装Fiddler的方法这里就略过了,一路Next就行了.装好之后运行软件,正常情况这个时候我们已经可以对电脑的网络请求进行抓包了.Fiddler默认的代理地址是127.0 ...
- 存储过程中使用事务和try catch
一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 : Cre ...
- Opencv Laplace算子
//通过拉普拉斯-锐化边缘 kernel = (Mat_<float>(3,3)<<1,1,1,1,-8,1,1,1,1);//Laplace算子 filter2D(img2, ...
- spring4-3-AOP-AspectJ注解-01-简单使用
1.引入类库 <dependency> <groupId>org.springframework</groupId> <artifactId>sprin ...