概念

模板指一些可以套用的公共内容,例如网页模板是当网站中有许多页面版式色彩相同的情况下,将其定义为网页模板,并定义其中部分可编辑,部分不可编辑,那么在利用网页模板制作其他页面时就会很方便,不易出错。
在设计模式中,模板方法模式中模板和生活中模板概念非常类似,在一个抽象类中定义一个操作中的算法骨架(对应于模板),而将一些步骤延迟到子类中去实现(对应根据自己的情况向模板填充内容)。
在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。此时就可以采用模板方法进行设计。

例如公司的入职流程,进入公司,入职准备、入职报到、办理入职手续、进行入职培训,转正,入职结束进入岗位。这些步骤都很固定,但是不同的公司,流程中每个步骤稍有不同。这些不同的可以在具体实现上进行填充。

特点

优点:
它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
它在父类中提取了公共的部分代码,实现了代码复用。
部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

缺点:
对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。

模式结构

根据模板方法模式类图结构,有利于我们理清该模式中类之间的关系,具体类图如下:

模板方法模式中涉及的角色:
抽象模板角色:定义了一个或多个抽象操作,以便让子类实现,这些抽象操作称为基本操作。它由一个模板方法和若干个基本方法构成。
  模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
  基本方法:是整个算法中的一个步骤,包含了抽象方法、具体方法。
具体模板角色:实现父类所定义的一个或多个抽象方法。

应用场景

算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。首先,要识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

实现

以入职流程为例,进行具体的实现。

using System;

namespace 模板模式
{
class EntryProcess
{
static void Main(string[] args)
{
SamsungEntryProcess samsung = new SamsungEntryProcess();
HuaweiEntryProcess huawei = new HuaweiEntryProcess(); samsung.JoiningCompany();
huawei.JoiningCompany(); Console.Read();
}
} // 抽象类,入职流程
public abstract class TemplateEntryProcess
{
// 模板方法,不要把模版方法定义为 Virtual 或 abstract 方法,避免被子类重写,防止更改流程的执行顺序
public void JoiningCompany()
{
this.entryCompany(); // 进入公司
this.preparationForEntry(); // 入职前准备,整理衣帽等
this.registrationForEmployment(); // 入职报到
this.entryProcedures(); // 办理入职手续
this.inductionTraining(); // 入职培训
this.evaluationOfConversion(); // 转正评估
this.entryOver(); // 入职结束,进入岗位
} public abstract void entryCompany(); public void preparationForEntry()
{
Console.WriteLine("做准备,整理衣帽等;");
} public void registrationForEmployment()
{
Console.WriteLine("入职报到;");
}
public void entryProcedures()
{
Console.WriteLine("办理入职手续;");
}
public void inductionTraining()
{
Console.WriteLine("进行入职培训;");
}
public void evaluationOfConversion()
{
Console.WriteLine("完成入职前培训,进行转正评估;");
}
public void entryOver()
{
Console.WriteLine("入职流程完成,进入岗位。");
} } // 具体子类,三星入职
public class SamsungEntryProcess: TemplateEntryProcess
{
public override void entryCompany()
{
Console.WriteLine("进入三星公司");
} } // 具体子类,华为入职
public class HuaweiEntryProcess: TemplateEntryProcess
{
public override void entryCompany()
{
Console.WriteLine("进入华为公司");
}
}
}

执行后结果

进入三星公司
做准备,整理衣帽等;
入职报到;
办理入职手续;
进行入职培训;
完成入职前培训,进行转正评估;
入职流程完成,进入岗位。
进入华为公司
做准备,整理衣帽等;
入职报到;
办理入职手续;
进行入职培训;
完成入职前培训,进行转正评估;
入职流程完成,进入岗位。

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

  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. java设计模式 模板方法模式Template Method

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

  5. 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

      设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...

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

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

  7. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图   相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...

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

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

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

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

随机推荐

  1. 图形渲染的大致过程和关于OpenGL渲染管线的一些零碎知识,openglpipeline,vao,vbo,ebo.

    重要!!! OpenGL新人一枚,希望可以再此和大家分享有用的知识,少走弯路 文章会定期更新,把前面几段已经整理过的知识更完后,接下来每周至少会更两次. 文章如果有不对的,理解错误的地方,也非常希望在 ...

  2. 内存操作【memset】【memcpy】

    void *memset(void *s, int c, unsigned long n); 将指针变量 s 所指向的前 n 字节的内存单元用一个"整数" c 替换,注意 c 是 ...

  3. 072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法

    072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法 本文知识点:综合案例-数组移位-在指定位置处插入数据方法 ...

  4. 027 01 Android 零基础入门 01 Java基础语法 03 Java运算符 07 逻辑“与”运算符

    027 01 Android 零基础入门 01 Java基础语法 03 Java运算符 07 逻辑"与"运算符 本文知识点:Java中的逻辑"与"运算符 逻辑运 ...

  5. 全方位剖析 Linux 操作系统,太全了!!!

    Linux 简介 UNIX 是一个交互式系统,用于同时处理多进程和多用户同时在线.为什么要说 UNIX,那是因为 Linux 是由 UNIX 发展而来的,UNIX 是由程序员设计,它的主要服务对象也是 ...

  6. [KMP]字符串匹配算法

    算法介绍: KMP是一种用来处理字符串匹配问题的算法,给你两个字符串A.B,让你回答B是否为A的子串,或者A中有多少子串等于B. 这题最暴力的做法是:枚举A中与B相等的子串的左端点,再判断是否与B相等 ...

  7. RHSA-2017:2930-重要: 内核 安全和BUG修复更新(需要重启、存在EXP、本地提权、代码执行)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  8. 初始python的类

    面向对象 一.面向对象 优点: 面向对象编程:是一类相似功能函数的集合,使你的代码更清晰化,更合理化. 面向对象,要拥有上帝的视角看问题,类其实就是一个公共模板,对象就从具体的模板实例化出来 类:就是 ...

  9. linux块设备驱动---相关结构体(转)

    上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...

  10. mysql5.5和5.6的一些区别

    timestamp 5.5中 直接写timestamp不加长度   5.6 中 写的timestamp(3) datatime 5.5中 直接写datetime 不加长度  5.6中 可以添加长度(3 ...