1.模板方法模式介绍

  提到模板我们经常会想到简历模板/PPT模板等,以简历模板为例,不同的人可以使用一样的简历模板,在填充内容时根据自己的名字/工作经历等填写自己的内容,从而形成不同的简历。在OO中模板方法模式和现实中的模板十分相似,首先要有一个封装了不可变部分的抽象类(简历的大致结构,都有姓名、性别、年龄、工作经历等),然后将可变部分延迟到子类中(不同人的简历内容不同,这些不同的内容放在子类中实现),模板方法就是多态的一种实现。抽象类中模板方法不仅仅可以定义内容的,也可以定义执行的顺序。

  以游戏厅打游戏为例,我们去游戏厅不管玩什么游戏都可以归结为四步:先投币,游戏初始化,玩游戏,游戏结束。这四步的顺序是不变的,其中第一步是不能改变的,无论我们玩什么游戏都要先投币。我们在代码中来理解模板方法模式的用法。

抽象游戏类和具体游戏类:

  1. /// <summary>
  2. /// 抽象游戏类
  3. /// </summary>
  4. public abstract class Game
  5. {
  6. //每款游戏都要投币,子类不能重写
  7. public void InsertCoins()
  8. {
  9. Console.WriteLine("往游戏机里投币...");
  10. }
  11. public abstract void InitGame();
  12. public abstract void StartGame();
  13. public abstract void EndGame();
  14.  
  15. //Play是模板方法,定义了子类执行的步骤
  16. public void Play()
  17. {
  18. //投币
  19. InsertCoins();
  20. //初始化游戏
  21. InitGame();
  22. //游戏开始
  23. StartGame();
  24. //游戏结束
  25. EndGame();
  26. }
  27. }
  28.  
  29. /// <summary>
  30. /// 恐龙快打游戏
  31. /// </summary>
  32. public class KLKDGame : Game
  33. {
  34. public override void InitGame()
  35. {
  36. Console.WriteLine("初始化恐龙快打游戏..");
  37. }
  38.  
  39. public override void StartGame()
  40. {
  41. Console.WriteLine("开始玩恐龙快打游戏..");
  42. }
  43. public override void EndGame()
  44. {
  45. Console.WriteLine("恐龙快打游戏结束!");
  46. }
  47. }
  48.  
  49. /// <summary>
  50. /// 三国无双游戏
  51. /// </summary>
  52. public class SGWSGame : Game
  53. {
  54. public override void InitGame()
  55. {
  56. Console.WriteLine("初始化三国无双..");
  57. }
  58.  
  59. public override void StartGame()
  60. {
  61. Console.WriteLine("开始玩三国无双..");
  62. }
  63. public override void EndGame()
  64. {
  65. Console.WriteLine("三国无双游戏结束!");
  66. }
  67. }

客户端调用:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //玩恐龙快打
  6. Game klkdGame = new KLKDGame();
  7. klkdGame.Play();
  8. Console.WriteLine();
  9.  
  10. //玩三国无双
  11. Game sgwsGame = new SGWSGame();
  12. sgwsGame.Play();
  13.  
  14. Console.ReadKey();
  15. }
  16. }

运行程序:

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

2.小结

上边例子的类图:

模板方法模式的应用场景:

  模板方法模式在抽象类中定义执行的方法和步骤,子类按需重写各个步骤的方法,从而满足具体的需求。某些行为可以分步执行且执行的步骤固定时可以考虑使用模板方法模式。

模板方法模式的优点:

  模板方法的行为由父类控制,子类实现,提取了公共代码,便于维护。

模板方法模式的缺点:

  每一种具体的实现都需要一个子类实现,可能会导致子类过多。

C#设计模式(14)——模板方法模式的更多相关文章

  1. C#设计模式(14)——模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

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

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  3. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  4. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式

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

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

  6. java设计模式之模板方法模式

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

  7. 【GOF23设计模式】模板方法模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...

  8. [设计模式] 22 模板方法模式 template

    转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...

  9. 再起航,我的学习笔记之JavaScript设计模式17(模板方法模式)

    模板方法模式 由模板方法模式开始我们正式告别结构型设计模式,开始行为型设计模式的学习分享 行为型设计模式用于不同对象之间职责划分或算法抽象,行为型设计模式不仅仅涉及类和对象,还涉及类或对象之间的交流模 ...

  10. Head First设计模式之模板方法模式

    一.定义 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法结构的情况下,重定义该算法中的某些特定步骤. 比较通俗的说法,子类决定如何实现算法中的某些步骤,比如两个一连串 ...

随机推荐

  1. 学习Android过程中遇到的问题及解决方法——AS为xutils添加依赖

    在使用xutils时遇到不能添加以来的问题,花了很长时间终于解决,网上添加依赖的方法很多,在此针对个人出现的问题作下笔记. 我本想使用jar包,因为在使用smartImageView时是用的jar包来 ...

  2. 实验九 在JSP中使用数据库

    实验性质:验证性 实验学时: 1学时 实验地点: 一 .实验目的与要求 1. 掌握在JSP中使用数据库的方法. 2. 掌握JSP对数据库的基本操作:增.删.改.查. 二. 实验内容 1.JSP访问数据 ...

  3. 洛谷P1074 靶形数独(算竞进阶习题)

    还是数独.. 比上一个多了个分数矩阵,其实没什么差别,但是数据好像水了许多... #include <bits/stdc++.h> #define INF 0x3f3f3f3f using ...

  4. linux 定时任务到秒级

    linux crontab 只有到分钟级别的 有两种方法 方法1.写个sh脚本,循环(下例为每秒访问一次百度) #! /bin/bash PATH=/bin:/sbin:/usr/bin:/usr/l ...

  5. 实验六 MapReduce实验:二次排序

    实验指导: 6.1 实验目的基于MapReduce思想,编写SecondarySort程序. 6.2 实验要求要能理解MapReduce编程思想,会编写MapReduce版本二次排序程序,然后将其执行 ...

  6. 自学Linux命令行与Shell脚本之路

    自学Linux命令行与Shell脚本之路[第一回]:初识Linux   1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3  ...

  7. 【BZOJ5308】[ZJOI2018]胖(模拟,ST表,二分)

    [BZOJ5308][ZJOI2018]胖(模拟,ST表,二分) 题面 BZOJ 洛谷 题解 首先发现每条\(0\)出发的边都一定会更新到底下的一段区间的点. 考虑存在一条\(0\rightarrow ...

  8. Mysql连接报错:1130 - Host ‘118.111.111.111’ is not allowed to connect to this MariaDB server

    这个问题是因为在数据库服务器中的mysql数据库中的user的表中没有权限(也可以说没有用户),下面将记录我遇到问题的过程及解决的方法. 在搭建完LNMP环境后用Navicate连接出错 遇到这个问题 ...

  9. hdu 1238 Substrings(kmp+暴力枚举)

    Problem Description You are given a number of case-sensitive strings of alphabetic characters, find ...

  10. kafka问题集锦

    一. org.apache.kafka.common.errors.TimeoutException: Batch Expired 问题描述:通过java客户端访问kafka服务器,当生产者线程向ka ...