C#设计模式(14)——模板方法模式
1.模板方法模式介绍
提到模板我们经常会想到简历模板/PPT模板等,以简历模板为例,不同的人可以使用一样的简历模板,在填充内容时根据自己的名字/工作经历等填写自己的内容,从而形成不同的简历。在OO中模板方法模式和现实中的模板十分相似,首先要有一个封装了不可变部分的抽象类(简历的大致结构,都有姓名、性别、年龄、工作经历等),然后将可变部分延迟到子类中(不同人的简历内容不同,这些不同的内容放在子类中实现),模板方法就是多态的一种实现。抽象类中模板方法不仅仅可以定义内容的,也可以定义执行的顺序。
以游戏厅打游戏为例,我们去游戏厅不管玩什么游戏都可以归结为四步:先投币,游戏初始化,玩游戏,游戏结束。这四步的顺序是不变的,其中第一步是不能改变的,无论我们玩什么游戏都要先投币。我们在代码中来理解模板方法模式的用法。
抽象游戏类和具体游戏类:
/// <summary>
/// 抽象游戏类
/// </summary>
public abstract class Game
{
//每款游戏都要投币,子类不能重写
public void InsertCoins()
{
Console.WriteLine("往游戏机里投币...");
}
public abstract void InitGame();
public abstract void StartGame();
public abstract void EndGame(); //Play是模板方法,定义了子类执行的步骤
public void Play()
{
//投币
InsertCoins();
//初始化游戏
InitGame();
//游戏开始
StartGame();
//游戏结束
EndGame();
}
} /// <summary>
/// 恐龙快打游戏
/// </summary>
public class KLKDGame : Game
{
public override void InitGame()
{
Console.WriteLine("初始化恐龙快打游戏..");
} public override void StartGame()
{
Console.WriteLine("开始玩恐龙快打游戏..");
}
public override void EndGame()
{
Console.WriteLine("恐龙快打游戏结束!");
}
} /// <summary>
/// 三国无双游戏
/// </summary>
public class SGWSGame : Game
{
public override void InitGame()
{
Console.WriteLine("初始化三国无双..");
} public override void StartGame()
{
Console.WriteLine("开始玩三国无双..");
}
public override void EndGame()
{
Console.WriteLine("三国无双游戏结束!");
}
}
客户端调用:
class Program
{
static void Main(string[] args)
{
//玩恐龙快打
Game klkdGame = new KLKDGame();
klkdGame.Play();
Console.WriteLine(); //玩三国无双
Game sgwsGame = new SGWSGame();
sgwsGame.Play(); Console.ReadKey();
}
}
运行程序:

在游戏厅打游戏的例子中,游戏抽象类的Play方法就是模板方法,这个方法定义了玩游戏的步骤,不管玩什么游戏都必须按照这个流程进行。
2.小结
上边例子的类图:

模板方法模式的应用场景:
模板方法模式在抽象类中定义执行的方法和步骤,子类按需重写各个步骤的方法,从而满足具体的需求。某些行为可以分步执行且执行的步骤固定时可以考虑使用模板方法模式。
模板方法模式的优点:
模板方法的行为由父类控制,子类实现,提取了公共代码,便于维护。
模板方法模式的缺点:
每一种具体的实现都需要一个子类实现,可能会导致子类过多。
C#设计模式(14)——模板方法模式的更多相关文章
- C#设计模式(14)——模板方法模式(Template Method)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- js设计模式——6.模板方法模式与职责链模式
js设计模式——6.模板方法模式与职责链模式 职责链模式
- java_设计模式_模板方法模式_Template Method Pattern(2016-08-11)
定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.这里的算法的结构,可以理解为你根据需求设计出来的业务流程.特定的步骤就是指那些 ...
- java设计模式之模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...
- 【GOF23设计模式】模板方法模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...
- [设计模式] 22 模板方法模式 template
转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...
- 再起航,我的学习笔记之JavaScript设计模式17(模板方法模式)
模板方法模式 由模板方法模式开始我们正式告别结构型设计模式,开始行为型设计模式的学习分享 行为型设计模式用于不同对象之间职责划分或算法抽象,行为型设计模式不仅仅涉及类和对象,还涉及类或对象之间的交流模 ...
- Head First设计模式之模板方法模式
一.定义 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法结构的情况下,重定义该算法中的某些特定步骤. 比较通俗的说法,子类决定如何实现算法中的某些步骤,比如两个一连串 ...
随机推荐
- ☆ [POJ1021] Intervals 「差分约束」
传送门 >Here< 题意:给出N段区间,并告诉你每段区间里有几个数(一个位置只能放一个数) 问总共至少有几个数 解题思路 差分约束题,本蒟蒻也是第一次做差分约束题…… 所谓差分约束,常常 ...
- bzoj1559 [JSOI2009]密码
题目链接:[JSOI2009]密码 我们先看第一问:输出方案数 我们把所有给出来的串丢到AC自动机里面去,然后在建出来的\(trie\)图上跑dp 由于\(n\leq 10\)我们很自然的就想到了状压 ...
- 修改KVM的模拟网卡类型
修改KVM的模拟网卡类型 来源 https://www.cnblogs.com/EasonJim/p/9751051.html 在KVM下可以生成两种型号的网卡,RTL8139和E1000,其实应该是 ...
- CentOS7搭建配置SVN服务器
安装subversionyum install subversionsubversion安装在/bin目录检查一下subversion是否安装成功svnserve --version 建立版本库sub ...
- Hdoj 1374.Knight Moves 题解
Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) where yo ...
- httpd配置
HTTP:Hypertext Transfer Protocol: HTML:Hypertext Markup Language: URL:Uniform Resource Locator,在Inte ...
- 【BZOJ5321】[JXOI2017]加法(贪心)
[BZOJ5321][JXOI2017]加法(贪心) 题面 BZOJ 洛谷 题解 显然二分答案,算一下每个点至少要覆盖的次数.从左往右考虑如果这个点覆盖次数不够,就会选择覆盖这个点的.右端点最大的线段 ...
- 【BZOJ5324】[JXOI2018]守卫(动态规划)
[BZOJ5324][JXOI2018]守卫(动态规划) 题面 BZOJ 洛谷 题解 既然只能看到横坐标在左侧的点,那么对于任意一个区间\([l,r]\)而言,\(r\)必须被选. 假设\(r\)看不 ...
- noiac132 B君的第三题 (树形dp)
传送门 本来想用点分治做,结果root又求不对 算的时候还算错了 我好菜啊 结果szr大佬告诉我是树形dp 我好菜啊!! 我们有$\lceil \frac{x}{k} \rceil = \frac{x ...
- angular与vue的应用对比
因为各种笔试面试,最近都没时间做一些值得分享的东西,正好复习一下vue技术栈,与angular做一下对比. angular1就跟vue比略low了. 1.数据绑定 ng1 ng-bind,{{ sco ...