C#设计模式14——模板方法的写法
模板方法(Template Method)是一种设计模式,它定义了一个操作中的算法的骨架,将某些步骤推迟到子类中实现,从而使得子类可以在不改变算法骨架的情况下重新定义算法的某些步骤。
作用:
使用模板方法可以使得代码的重复度降低,同时也能够避免由于算法中某个特定步骤的改变导致整体算法需要改变的情况。此外,模板方法也使得维护和扩展代码变得更加容易。
怎么做:
在C#中,可以通过抽象类和虚方法来实现模板方法。具体的做法是,定义一个抽象类,声明大致的算法流程,并将其中某些步骤声明为虚方法,待子类继承该抽象类后,根据需要实现其虚方法。这样,就可以通过调用抽象类中的算法流程,由子类来具体实现算法中的某些步骤,从而得出结果。
何时用:
模板方法常用于以下场景:
1.在多个类中有相同的方法,但具体的实现细节有所不同。
2.需要在代码中使用一种算法,但是该算法中某些步骤需要根据具体情况进行不同的实现。
3.需要保证所有使用该算法的地方都能得到相同的结果。
4.需要把具体的实现过程从算法中分离开来,使得算法更容易扩展和维护。
5.需要让子类只能实现算法中的某一部分,而不能改变整个算法的结构。
如何实现:
在C#中,使用模板方法的关键是要定义一个抽象类,包含所有的算法流程,但某些步骤需要由子类来具体实现。因此,在抽象类中,通常会定义一些虚方法,用于在子类中具体实现算法。抽象类的代码示例:
//抽象类
public abstract class AbstractClass
{
//模板方法,定义算法骨架
public void TemplateMethod()
{
//步骤1
Step1();
//步骤2
Step2();
//步骤3
Step3();
}
//步骤1(抽象方法,由子类具体实现)
public abstract void Step1();
//步骤2(虚方法,子类可以覆盖,默认实现为空)
public virtual void Step2()
{
//默认实现为空
}
//步骤3(抽象方法,由子类具体实现)
public abstract void Step3();
}
在抽象类中,定义了一个模板方法TemplateMethod(),其中具体的算法流程已经定义好了,但某些步骤则需要由子类来具体实现,因此,在抽象类中,对于某些需要具体实现的步骤,我们使用抽象方法进行声明,在子类中需要对这些抽象方法进行具体实现;而对于某些步骤,它们的实现可以在基类中进行默认实现,因此,我们可以使用虚方法进行声明,在子类中也可以选择覆盖这些虚方法。
下面是一个使用模板方法的示例:
//具体类1
public class ConcreteClassA : AbstractClass
{
public override void Step1()
{
Console.WriteLine("ConcreteClassA:Step1");
}
public override void Step3()
{
Console.WriteLine("ConcreteClassA:Step3");
}
}
//具体类2
public class ConcreteClassB : AbstractClass
{
public override void Step1()
{
Console.WriteLine("ConcreteClassB:Step1");
}
public override void Step2()
{
Console.WriteLine("ConcreteClassB:Step2");
}
public override void Step3()
{
Console.WriteLine("ConcreteClassB:Step3");
}
}
//客户端调用
class Client
{
static void Main(string[] args)
{
AbstractClass ac1 = new ConcreteClassA();
ac1.TemplateMethod();
AbstractClass ac2 = new ConcreteClassB();
ac2.TemplateMethod();
}
}
在这个示例中,我们定义了两个具体类——ConcreteClassA和ConcreteClassB,它们都继承了抽象类AbstractClass,并根据需要实现了其中的虚方法。
在主函数中,我们实例化了这两个具体类,并分别调用它们的TemplateMethod()方法,从而得到了两个具体类的实例化对象。这些对象都实现了同样的模板方法(算法流程),但由于其中某些步骤使用了不同的实现方法,输出结果也不同:
```
ConcreteClassA:Step1
ConcreteClassA:Step2
ConcreteClassA:Step3
ConcreteClassB:Step1
ConcreteClassB:Step2
ConcreteClassB:Step3
```
C#设计模式14——模板方法的写法的更多相关文章
- C#设计模式(14)——模板方法模式(Template Method)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- js设计模式——6.模板方法模式与职责链模式
js设计模式——6.模板方法模式与职责链模式 职责链模式
- java_设计模式_模板方法模式_Template Method Pattern(2016-08-11)
定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.这里的算法的结构,可以理解为你根据需求设计出来的业务流程.特定的步骤就是指那些 ...
- java设计模式之模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...
- 【GOF23设计模式】模板方法模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...
- [设计模式] 22 模板方法模式 template
转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...
- [译]Java 设计模式 之模板方法
(文章翻译自Java Design Pattern: Template Method) 模板方法设计模式定义了归档特定操作的工作流.它允许子类去修改特定的步奏而不用改变工作流的结构. 下面的例子表示模 ...
- Java设计模式之模板方法设计模式(银行计息案例)
不知道为什么,这几天对Java中的设计模式非常感兴趣,恰巧呢这几天公司的开发任务还不算太多,趁着有时间昨天又把模板方法模式深入学习了一下,做了一个客户在不同银行计息的小案例,感触颇深,今天给各位分享一 ...
随机推荐
- JTAG串链
- [ABC263G] Erasing Prime Pairs
Problem Statement There are integers with $N$ different values written on a blackboard. The $i$-th v ...
- MinIO实现文件上传
一.使用Docker安装minio docker run -d -p 9000:9000 -p 9001:9001 --name minio -e MINIO_ACCESS_KEY=qbb -e MI ...
- 华企盾DSC备用服务器无法启动,日志显示“主服务器停机超过十天”
出现该问题有三种情况: 1.主服务器未启动或授权到期: 2.主服务器申请的在线授权且ERP上存在到期的相同序列号: 3.备用服务器的数据库与主服务器连的不是同一个(检查IP和端口以及数据库名).
- ElasticSearch之cat anomaly detectors API
curl -X GET "https://localhost:9200/_cat/ml/anomaly_detectors?v=true&pretty" --cacert ...
- Python——第三章:函数的返回值
函数的返回值: 函数执行之后. 会给调用方一个结果. 这个结果就是返回值 关于return: 函数只要执行到了return. 函数就会立即停止并返回内容. 函数内的return的后续的代 ...
- STM32CubeMX教程8 TIM 通用定时器 - 输出比较
1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 逻 ...
- Vue3中使用TypeScript封装axios遇到的问题(AxiosRequestConfig)
如果您有更好的解决方法,欢迎评论区评论. 版本 "dependencies": { "axios": "^1.4.0", "van ...
- 文心一言 VS chatgpt (17)-- 算法导论4.1 3~4题
三.在你的计算机上实现最大子数组问题的暴力算法和递归算法.请指出多大的问题规模n0是性能交叉点一一从此之后递归算法将击败暴力算法?然后,修改递归算法的基本情况一一当问题规模小于 n0 时采用暴力算法. ...
- HDU 2144 Evolution 后缀树/后缀数组
HDU 2144 Evolution 后缀树/后缀数组 题意 给我们不到一百个字符串(长度不到一百)以及一个百分比q,然后如果某两个字符串的最长公共子串占比超过了q(在两个串中都超过)则两个串为一个集 ...