一、目的

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

二、定义

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

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

三、场景

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

四、实现

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

    运行scrapy时出错这个错误:Max retries exceeded with url解决方法: img1=requests.get(url=aa,headers=header1,timeout= ...

  2. stream之forEach的用法

    public static class Student{ private String name; private String sex; private String age; public Str ...

  3. 【LeetCode】523. 连续的子数组和

    523. 连续的子数组和 知识点:数组:前缀和: 题目描述 给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组: 子数组大小 至少为 2 ,且 ...

  4. 微信小程序云开发-云函数-云函数实现数据的查询、修改和删除功能

    一.云函数获取商品信息 1.创建云函数getData,云函数功能:获取商品信息 2.在本地小程序页面调用云函数getData  二.云函数修改商品信息 1.创建云函数updateData,云函数功能: ...

  5. CentOS下 Django部署 nginx+uWSGI+Django(二)

    该篇内容承接CentOS下 Django部署 uWSGI+Django(一),细节流程可参考此篇内容. 1. 当前系统 CentOS Linux release 7.6.1810 Python 2.7 ...

  6. Beego和Vue的前后端分离跨域问题处理

    VUE封装的请求头(注意请求头,跨域要用到) 路径 utils/mereq.js import request from '@/utils/request' import qs from 'qs' e ...

  7. 第二十一篇 -- QTimer实现秒表功能

    效果图: 程序一开始就开始计时,当完成了相关功能(在线程中完成)之后,就触发停止信号,停止定时器. time.py #!/usr/bin/env python # _*_ coding: UTF-8 ...

  8. win10家庭版无法访问samba

    1:本教程只针对win10家庭版用户,右键点击电脑选择属性就能看到自己的版本.(因为win10家庭版没有本地策略组) 2:针对一下连接不上的情况               3:连接不上的情况 ① : ...

  9. C++派生类的拷贝构造

    一. 概述 通过几个简单的实验,回顾下派生类中拷贝构造的相关知识. 环境:Centos7 64位, g++ 4.8.5 在继承中,构造器与析构器均没有被继承下来.拷贝构造,也是一种构造,也没有被继承下 ...

  10. 工业互联网之微信小程序整体解决方案总结

    随着工业互联网的快速发展,以及微信小程序的成熟,将两者结合实现对工况数据的查看和存储方案变得简单.以下方式为本人尝试过的整体解决方案,可以顺利实现无缝对接. 1.采集方式 1.ifix/intouch ...