C#设计模式之22-模板方法模式
模板方法模式(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-模板方法模式的更多相关文章
- 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...
- c#设计模式系列:模板方法模式(Template Method Pattern)
引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等,在现实生活中,模板的概念就是--有一个规定的格 ...
- [设计模式] 22 模板方法模式 template
转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...
- 《Java设计模式》之模板方法模式
模板方法模式是类的行为模式.准备一个抽象类.将部分逻辑以详细方法以及详细构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有 ...
- C#设计模式系列:模板方法模式(Template Method)
你去银行取款的时候,银行会给你一张取款单,这张取款单就是一个模板,它把公共的内容提取到模板中,只留下部分让用户来填写.在软件系统中,将多个类的共有内容提取到一个模板中的思想便是模板方法模式的思想. 模 ...
- Java设计模式学习记录-模板方法模式
前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...
- C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】
一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...
- 设计模式之七:模板方法模式(Template Method)
模板方法模式: 定义了一个算法的基本操作骨架,并将算法的一些步骤延迟到子类中来实现. 模板方法模式让子类在不更改算法结构的前提下能够又一次定义算法的一些步骤. Define the skeleton ...
- 设计模式之禅——模板方法模式&钩子方法
** **板方法模式的定义: 定义一个操作的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的框架即可重定义该算法的某些特定步骤. 例子:做一个简单的悍马车的模型 见UML图 一个抽象 ...
- 大话设计模式Python实现-模板方法模式
模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 下面是一个模 ...
随机推荐
- maven自动创建项目目录骨架
方法一: 1:打开命令窗口 在要创建项目的路径下按住H2SIT ,然后点击右键 ,在弹出菜单中选择 在此处打开命令窗口(W) 2:目录创建 方法二:
- 大厂程序员教你如何学习C++(内附学习资料)
目前准备面试同学都知道,C++是百度和腾讯的主流开发语言,而java是阿里的主流开发语言. 对于初学者来说,也不用纠结究竟学习c++还是java 其实只要好好掌握好一门即可,另一门即可融会贯通 因为我 ...
- ant design pro : 依赖项 webpack-theme-color-replacer 最新版导致项目无法启动?
重新装了一个项目的依赖,结果发现打不开了? 报错如下: This dependency was not found: * webpack-theme-color-replacer/client in ...
- CCNA - Part10 数据包的通信过程
这篇文章主要是对数据包在同网段和不同网段的转发流程梳理,使用 ping 命令进行实际抓包测试. 网关的概念: 对于像 PC 等终端设备来说,通过交换机可以实现同网段的通信.但如果想要给其他网段发生数据 ...
- Shell基本语法---shell数组
shell数组 arr=( ) #定义数组 echo ${#arr[*]} #打印数组长度 echo ${arr[]} #打印数组的第一个成员 echo ${arr[]} #打印数组的二个成员 ech ...
- ant design pro/前端/JS:实现本地运行https
工具:github---mkcert 用于生成本地证书 ant p版本:1.0.0 这里我只说如何给antp部署https,以及会遇到的问题解决,其他请看原文参考 1.用mkcert生成证书,去git ...
- 一文说通C#中的异步编程
天天写,不一定就明白. 又及,前两天看了一个关于同步方法中调用异步方法的文章,里面有些概念不太正确,所以整理了这个文章. 一.同步和异步. 先说同步. 同步概念大家都很熟悉.在异步概念出来之前,我 ...
- redis pipelined 示例
redis 常用的数据类型 有序集合(sort set).无序集合 (set),hashMap redis pipelined 示例 List<Object> list = jedisTe ...
- mac下高效安装 homebrew 及完美避坑姿势 (亲测有效)
世上无难事,只要找到 Homebrew 的正确安装方式. Homebrew 是什么 Homebrew是 mac的包管理器,仅需执行相应的命令,就能下载安装需要的软件包,可以省掉自己去下载.解压.拖拽( ...
- 线程_使用multiprocessing启动一个子进程及创建Process 的子类
from multiprocessing import Process import os # 子进程执行的函数 def run_proc(name): print("子进程运行中,名称:% ...