一、目的

模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。

二、定义

模板方法模式:在一个抽象类中定义一个操作的算法骨架,将算法骨架中某些特定的操作延迟到子类中实现。

模板方法使得子类在不改变一个算法骨架的前提下,重新定义算法的某些特定步骤。

三、场景

现实生活中,我们炒菜一般遵循一个特定的步骤,无论炒什么菜,基本步骤是一样的,只是菜品不一样而已,下面我我们用模板方法模式来模拟这一场景。

四、实现

  1. 1 using System;
  2. 2 using System.Collections.Generic;
  3. 3 using System.Linq;
  4. 4 using System.Text;
  5. 5 using System.Threading.Tasks;
  6. 6
  7. 7 namespace DesignMode_TemplateMethod
  8. 8 {
  9. 9 public abstract class CookVegetable
  10. 10 {
  11. 11 // 模板方法,不要把模版方法定义为Virtual或abstract方法,避免被子类重写,防止更改流程的执行顺序
  12. 12 public void CookVegetableTemplate()
  13. 13 {
  14. 14 Console.WriteLine("炒蔬菜的模板方法");
  15. 15 PourOil();
  16. 16 HeatOil();
  17. 17 PourVegetable();//放入何种蔬菜由具体的子类决定
  18. 18 PourSalt();
  19. 19 StirFry();
  20. 20 }
  21. 21
  22. 22 public void PourOil()
  23. 23 {
  24. 24 Console.WriteLine("往锅里倒油");
  25. 25 }
  26. 26 public void HeatOil()
  27. 27 {
  28. 28 Console.WriteLine("把油加热");
  29. 29 }
  30. 30
  31. 31 // 油热了之后倒蔬菜下去,具体哪种蔬菜由子类决定
  32. 32 public abstract void PourVegetable();
  33. 33
  34. 34 public void PourSalt()
  35. 35 {
  36. 36 Console.WriteLine("放入精盐");
  37. 37 }
  38. 38 public void StirFry()
  39. 39 {
  40. 40 Console.WriteLine("翻炒");
  41. 41 }
  42. 42 }
  43. 43
  44. 44 public class CookCabbage : CookVegetable
  45. 45 {
  46. 46 public override void PourVegetable()
  47. 47 {
  48. 48 Console.WriteLine("倒入大白菜");
  49. 49
  50. 50 }
  51. 51 }
  52. 52 public class CookPotato : CookVegetable
  53. 53 {
  54. 54 public override void PourVegetable()
  55. 55 {
  56. 56 Console.WriteLine("倒入马铃薯");
  57. 57 }
  58. 58 }
  59. 59 class Program
  60. 60 {
  61. 61 static void Main(string[] args)
  62. 62 {
  63. 63 CookPotato cookPotato = new CookPotato();
  64. 64 CookCabbage cookCabbage = new CookCabbage();
  65. 65
  66. 66 cookPotato.CookVegetableTemplate();
  67. 67 Console.WriteLine("********************");
  68. 68 cookCabbage.CookVegetableTemplate();
  69. 69
  70. 70 Console.ReadLine();
  71. 71 }
  72. 72 }
  73. 73 }

运行结果如下:

五、类图

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. java设计模式 模板方法模式Template Method

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...

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

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

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

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

随机推荐

  1. C语言:条件编译

    假如现在要开发一个C语言程序,让它输出红色的文字,并且要求跨平台,在 Windows 和 Linux 下都能运行,怎么办呢?这个程序的难点在于,不同平台下控制文字颜色的代码不一样,我们必须要能够识别出 ...

  2. 家庭账本开发day05

    套用layUI模板,成功完成账单的添加,并且能同时对用户的余额进行增加和减少

  3. Java基础00-学生管理系统16

    1. 学生管理系统 1.1 项目演示 1.2 实现思路 1.3 定义学生类 public class Student { private String sid; private String name ...

  4. TypeScript——原始数据类型

    TypeScript原始数据类型 原始数据类型包括:布尔值.数值.字符串.null.undefined. Symbol.BigInt. 布尔值: let isDone: boolean = false ...

  5. ajax和springmvc的请求响应原理——深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法

    1,四大重要部分: 请求链接 post请求和get请求 请求参数形式 响应内容形式 2,从springmvc的controller角度,controller能接收到请求的前提 请求链接必须对应 pos ...

  6. HCNA Routing&Switching之动态路由协议OSPF DR和BDR

    前文我们了解了OSPF建立邻居关系的条件,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15032907.html:今天我们来聊一聊OSPF中的DR和BDR: ...

  7. Maven工程 报 Diamond types are not supported at language level '5'

    Maven工程 报 Diamond types are not supported at language level '5' 出现这种信息,一般表示的是你的language level(IDEA下J ...

  8. 足不出户,一探古今,打造线上3D数字博物馆!

    随着3D技术的不断革新,为了让更多的用户领略历史之美,越来越多的博物馆开始举办线上展览.通过模拟不同的环境.灯光投影.360°无死角放大缩小展品,观众可以享受到身临其境的沉浸体验.不仅如此,给展品加上 ...

  9. SpringCloud升级之路2020.0.x版-2.微服务框架需要考虑的问题

    本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ 上图中演示了一 ...

  10. 租了一台华为云耀云服务器,却直接被封公网ip,而且是官方的bug导致!

    小弟在博客园也有十多个年头了,因为离开了.net圈子,所以很少发文,今天可算是被华为云气疯了.写下这篇文章,大家也要注意自查一下,避免无端端被封公网ip. 因为小弟创业公司业务发展,需要一个公网做宣传 ...