模板方法模式(Template Method Pattern)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/429 访问。

模板方法模式属于行为型模式,定义一个模板结构,将具体内容延迟到子类去实现。

在不改变模板结构的前提下在子类中重新定义模板中的内容。

角色:

1、抽象类(Abstract Class)

实现了模板方法,定义了算法的框架;

2、具体类(Concrete Class)

实现抽象类中的抽象方法,以完成完整的算法。

命名空间TemplateMethod中包含DataSource数据源抽象类,其中有一些实例方法、抽象方法和钩子方法(IsNotJson),ShowChart方法使用数据源显示一个图表。本示例使用这个案例来向大家讲解模板方法模式的实现要领。

namespace TemplateMethod
public abstract class DataSource {

    protected abstract void FetchSource();

    protected virtual bool IsNotJson() {
return true;
} protected abstract void Convert2Json(); protected abstract void ShowData(); public void ShowChart() {
FetchSource();
if (IsNotJson()) {
Convert2Json();
}
ShowData();
Console.WriteLine("----------------------------------");
} }

数据源抽象基类DataSouce,包含取数据FetchSource方法,是否是Json数据IsNotJson方法,转化成Json格式Convert2Json方法,最后是显示数据图表ShowChart方法。

C#开发笔记之03-为什么选择IsNotXXX方法而不是IsXXX方法?

public class TextData : DataSource {

    protected override void FetchSource() {
Console.WriteLine($"Fetch data from {this.ToString()}!");
} protected override void Convert2Json() {
Console.WriteLine($"Convert {this.ToString()} to Json!");
} protected override void ShowData() {
Console.WriteLine($"Show data in chart control!");
} }

文本数据源TextData类。

public class BinaryData : DataSource {

    protected override void FetchSource() {
Console.WriteLine($"Fetch data from {this.ToString()}!");
} protected override void Convert2Json() {
Console.WriteLine($"Convert {this.ToString()} to Json!");
} protected override void ShowData() {
Console.WriteLine($"Show data in chart control!");
} }

二进制数据源BinaryData类。

public class JsonData : DataSource {

    protected override void FetchSource() {
Console.WriteLine($"Fetch data from {this.ToString()}!");
} protected override bool IsNotJson() {
return false;
} protected override void Convert2Json() {
Console.WriteLine("This line can not be reached!");
Console.WriteLine("There's no need to convert data!");
} protected override void ShowData() {
Console.WriteLine($"Show data in chart control!");
} }

Json数据源JsonData类。

public class CloudData : DataSource {

    protected override void FetchSource() {
Console.WriteLine($"Fetch data from {this.ToString()}!");
} protected override void Convert2Json() {
Console.WriteLine($"Convert {this.ToString()} to Json!");
} protected override void ShowData() {
Console.WriteLine($"Show data in chart control!");
} }

云数据源CloudData类。

public class Program {

    private static DataSource _dataSource = null;

    public static void Main(string[] args) {
_dataSource = new TextData();
_dataSource.ShowChart(); _dataSource = new BinaryData();
_dataSource.ShowChart(); _dataSource = new JsonData();
_dataSource.ShowChart(); _dataSource = new CloudData();
_dataSource.ShowChart(); Console.ReadKey();
} }

以上是调用方的代码,以下是这个案例的输出结果:

Fetch data from TemplateMethod.TextData!
Convert TemplateMethod.TextData to Json!
Show data in chart control!
----------------------------------
Fetch data from TemplateMethod.BinaryData!
Convert TemplateMethod.BinaryData to Json!
Show data in chart control!
----------------------------------
Fetch data from TemplateMethod.JsonData!
Show data in chart control!
----------------------------------
Fetch data from TemplateMethod.CloudData!
Convert TemplateMethod.CloudData to Json!
Show data in chart control!
----------------------------------

优点:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/429 访问。

1、提高代码复用性,可以将相同部分的代码放在抽象的父类中;

2、提高了拓展性,将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为;

3、实现了反向控制,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为。

缺点:

1、引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。

使用场景:

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

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

C#设计模式之22-模板方法模式的更多相关文章

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

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

  2. c#设计模式系列:模板方法模式(Template Method Pattern)

    引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等,在现实生活中,模板的概念就是--有一个规定的格 ...

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

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

  4. 《Java设计模式》之模板方法模式

    模板方法模式是类的行为模式.准备一个抽象类.将部分逻辑以详细方法以及详细构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有 ...

  5. C#设计模式系列:模板方法模式(Template Method)

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

  6. Java设计模式学习记录-模板方法模式

    前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...

  7. C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】

    一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...

  8. 设计模式之七:模板方法模式(Template Method)

    模板方法模式: 定义了一个算法的基本操作骨架,并将算法的一些步骤延迟到子类中来实现. 模板方法模式让子类在不更改算法结构的前提下能够又一次定义算法的一些步骤. Define the skeleton ...

  9. 设计模式之禅——模板方法模式&钩子方法

    ** **板方法模式的定义: 定义一个操作的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的框架即可重定义该算法的某些特定步骤. 例子:做一个简单的悍马车的模型 见UML图 一个抽象 ...

  10. 大话设计模式Python实现-模板方法模式

    模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 下面是一个模 ...

随机推荐

  1. Guava集合--新集合类型

    Guava引入了很多JDK没有的.但我们发现明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契约 ...

  2. 技术小菜比入坑 LinkedList,i 了 i 了

    先看再点赞,给自己一点思考的时间,思考过后请毫不犹豫微信搜索[沉默王二],关注这个长发飘飘却靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有技术大佬整理 ...

  3. 利用tox打造自动自动化测试框架

    什么是tox tox官方文档的第一句话 standardize testing in Python,意思就是说标准化python中的测试,那是不是很适合测试人员来使用呢,我们来看看他究竟是什么? 根据 ...

  4. 本周六 Apache DolphinScheduler & Doris 将联合线上 Meetup

    活动背景 2020年,大数据成为国家基建的一个重要组成,大数据在越来越多的领域展现威力.随着大数据的应用场景越来越多,大家对数据的响应速度和数据加工工作流的方便程度也提出了更高的要求.在这种背景下,相 ...

  5. Java Object类中的equals方法

    Object类中的equals方法用于检测一个对象是否等于另外一个对象.在Object类中,这个方法将判断两个对象是否具有相同的引用.如果两个对象具有相同的引用,它们一定是相等的.从这点上看,将其作为 ...

  6. .Net、ASP.Net、C#、VisualStudio之间的关系是什么

    .Net一般指的是.NetFramework,提供了基础的.Net类,这些类可以被任何一种.Net编程语言调 用,.NetFramework还提供了 CLR.JIT.GC等基础功能. ASP.Net是 ...

  7. DP学习记录Ⅰ

    DP学习记录Ⅱ 前言 状态定义,转移方程,边界处理,这三部分想好了,就问题不大了.重点在状态定义,转移方程是基于状态定义的,边界处理是方便转移方程的开始的.因此最好先在纸上写出自己状态的意义,越详细越 ...

  8. ‘100%’wuxiao

    有时候设置控件的width:’100%‘无效,  群友解释, 因为父控件的大小要靠自空间撑起来,确定    ??????

  9. Git 撤销更改

    一.未使用 git add 缓存代码时 可以使用 git checkout -- filepathname (比如: git checkout -- readme.md  ,不要忘记中间的 “--” ...

  10. goroutine间的同步&协作

    Go语言中的同步工具 基础概念 竞态条件(race condition) 一份数据被多个线程共享,可能会产生争用和冲突的情况.这种情况被称为竞态条件,竞态条件会破坏共享数据的一致性,影响一些线程中代码 ...