你去银行取款的时候,银行会给你一张取款单,这张取款单就是一个模板,它把公共的内容提取到模板中,只留下部分让用户来填写。在软件系统中,将多个类的共有内容提取到一个模板中的思想便是模板方法模式的思想。

  模板方法模式是基于继承的代码复用基本技术,在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中。

  在模板方法模式中,需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数形式实现,然后声明一些抽象方法来让子类实现剩余逻辑。不同的子类可以以不同的方式实现这些抽象方法。

1.1>、定义

  定义一个操作中算法的骨架,将这些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

1.2>、使用频率

   中等

2、模板方法模式结构

2.1>、结构图

2.2>、参与者

  模板方法模式参与者:

  ◊ AbstractClass:定义一个模板,其子类将重定义PrimitiveOperation1和PrimitiveOperation2操作。

  ◊ ConcreteClass:实现PrimitiveOperation1和PrimitiveOperation2以完成算法中与特定子类(Client)相关的内容。

  在模板方法模式中,AbstractClass中的TemplateMethod提供了一个标准模板,该模板包含PrimitiveOperation1和PrimitiveOperation2两个方法,这两个方法的内容Client可以根据自己的需要重写。

3、模板方法模式结构实现

  AbstractClass.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace DesignPatterns.TemplateMethodPattern.Structural
  7. {
  8. public abstract class AbstractClass
  9. {
  10. public abstract void PrimitiveOperation1();
  11. public abstract void PrimitiveOperation2();
  12.  
  13. /// <summary>
  14. /// The "Template method"
  15. /// </summary>
  16. public void TemplateMethod()
  17. {
  18. PrimitiveOperation1();
  19. PrimitiveOperation2();
  20. Console.WriteLine("");
  21. }
  22. }
  23. }

  ConcreteClassA.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace DesignPatterns.TemplateMethodPattern.Structural
  7. {
  8. public class ConcreteClassA : AbstractClass
  9. {
  10. public override void PrimitiveOperation1()
  11. {
  12. Console.WriteLine("ConcreteClassA.PrimitiveOperation1()");
  13. }
  14.  
  15. public override void PrimitiveOperation2()
  16. {
  17. Console.WriteLine("ConcreteClassA.PrimitiveOperation2()");
  18. }
  19. }
  20. }

  ConcreteClassB.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace DesignPatterns.TemplateMethodPattern.Structural
  7. {
  8. public class ConcreteClassB : AbstractClass
  9. {
  10. public override void PrimitiveOperation1()
  11. {
  12. Console.WriteLine("ConcreteClassB.PrimitiveOperation1()");
  13. }
  14.  
  15. public override void PrimitiveOperation2()
  16. {
  17. Console.WriteLine("ConcreteClassB.PrimitiveOperation2()");
  18. }
  19. }
  20. }

  Program.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using DesignPatterns.TemplateMethodPattern.Structural;
  7.  
  8. namespace DesignPatterns.TemplateMethodPattern
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. AbstractClass aA = new ConcreteClassA();
  15. aA.TemplateMethod();
  16.  
  17. AbstractClass aB = new ConcreteClassB();
  18. aB.TemplateMethod();
  19. }
  20. }
  21. }

  运行输出:

  1. ConcreteClassA.PrimitiveOperation1()
  2. ConcreteClassA.PrimitiveOperation2()
  3.  
  4. ConcreteClassB.PrimitiveOperation1()
  5. ConcreteClassB.PrimitiveOperation2()
  6.  
  7. 请按任意键继续. . .

4、模板方法模式应用分析

  模板方法模式适用情形:

  ◊ 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。

  ◊ 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。

  ◊ 控制子类扩展。模板方法只允许在特定点进行扩展,而模板部分则是稳定的。

  模板方法模式特点:

  ◊ TemplateMethod模式是一种非常基础性的设计模式,在面向对象系统中大量应用。它用最简洁的机制(基础、多态)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。

  ◊ 在具体实现方面,被TemplateMethod调用的虚方法可以具有实现,也可以没有任何实现(抽象方法或虚方法)。但一般推荐将它们设置为protected方法使得只有子类可以访问它们。

  ◊ 模板方法模式通过对子类的扩展增加新的行为,符合“开闭原则”。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 模板方法模式-Template Method(Java实现)

    模板方法模式-Template Method 在模板模式中, 处理的流程被定义在父类中, 而具体的处理则交给了子类. 类关系图很简单: Template接口 这里定义了子类需要实现的方法(before ...

  10. 设计模式总结篇系列:模板方法模式(Template Method)

    模板方法模式需要开发抽象类和具体子类之间的协作.抽象类负责给出一个算法的轮廓和骨架,子类则负责给出这个算法的各个逻辑步骤.代表这些具体逻辑步骤的方法称做基本方法(primitive method):而 ...

随机推荐

  1. React 组件性能优化

    React组件性能优化 前言 众所周知,浏览器的重绘和重排版(reflows & repaints)(DOM操作都会引起)才是导致网页性能问题的关键.而React虚拟DOM的目的就是为了减少浏 ...

  2. 线程和线程池的理解与java简单例子

    1.线程 (1)理解,线程是系统分配处理器时间资源的基本单元也是系统调用的基本单位,简单理解就是一个或多个线程组成了一个进程,进程就像爸爸,线程就像儿子,有时候爸爸一个人干不了活就生了几个儿子干活,会 ...

  3. 用soapUI测试webservice

    测试webservice时,有时需要写一个客户端来向服务端发起请求才可以测试服务,最近看到一款工具soap ui,也可以调试VS2010中的程序. 首先要把webservice 发布到本地,网上已经有 ...

  4. 基于node.js的压缩合并安装

    1.构建工具(grunt,gulp) 下载地址:http://gruntjs.cn/http://gruntjs.com/ (1)安装nodejs(http://www.nodejs.org/) 验证 ...

  5. Erlang error handling

    Erlang error handling Contents Preface try-catch Process link Erlang-way error handling OTP supervis ...

  6. matlab环境配置

    一.环境变量设置 AMD处理器:右键单击我的电脑 属性 — >高级 —> 环境变量 —> 系统变量 —> 新建 变量名:BLAS_VERSION,值为安装目录\atlas_At ...

  7. 有状态Bean和无状态Bean的定义

    有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”:一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束.即每个用户最初都会得到一个初 ...

  8. android的EditText重新获取焦点问题

    在android开发过程中关于EditText在setFocusable(false);后,当需要再次获得焦点输入时设置setFocusable(true);后还是无法获得焦点的问题: 解决办法: 对 ...

  9. *HDU2254 矩阵乘法

    奥运 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  10. 新手 gulp+ seajs 小demo

    首先,不说废话,它的介绍和作者就不在多说了,网上一百度一大堆: 我在这里只是来写写我这2天抽空对seajs的了解并爬过的坑,和实现的一个小demo(纯属为了实现,高手请绕道); 一.环境工具及安装 1 ...