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中的设计模式非常感兴趣,恰巧呢这几天公司的开发任务还不算太多,趁着有时间昨天又把模板方法模式深入学习了一下,做了一个客户在不同银行计息的小案例,感触颇深,今天给各位分享一 ...
随机推荐
- springboot——入门案例
真简单啊 springboot 学了入门案例,有感而发 首先是一个自带的配置文件: package com.example.springboot_01; import org.springframew ...
- Python实现贪吃蛇大作战
贪吃蛇 初始版本 初始版本,只存在基本数据结构--双向队列. 游戏思路 贪吃蛇通过不断得吃食物来增长自身,如果贪吃蛇碰到边界或者自身则游戏失败. 食物是绿色矩形来模拟,坐标为随机数生成,定义一个蛇长变 ...
- Linux查看内存使用情况以及释放内存
查看内存使用情况 一般使用 top 命令即可,命令行输入 top会实时显示内存和cpu等硬件的使用情况,然后输入M即显示内存的使用情况. 但是有些情况下,内存明明被占用了,但是使用top命令依然无法找 ...
- Chrome扩展程序是如何进行消息传递的
大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. 一个复杂的 Chrome 扩展程序通常由 content_scripts,background,ac ...
- 从零玩转设计模式之抽象工厂设计模式-chouxiangshejimoshi
title: 从零玩转设计模式之抽象工厂设计模式 date: 2022-12-08 16:05:03.28 updated: 2022-12-11 23:03:16.842 url: https:// ...
- 合宙esp32 c3 micro python 固件配置(基于thonny)
首先,本文档是已经配置过其他esp32后发现合宙的配置需要修改一些地方. 为了让新手们减少掉坑成本,故做了一个图文指导. 准备工作: 1.thonny安装(不讲,自己去查教程) 2.esp32c3 m ...
- java后端工具类之从0到1生成数字证书(RSA)
开放签电子签章系统-开源版这周(2023-12-15)就要上线发布了,为了让开源版能够更好的服务广大研发工程师,接下来会详细的说说开源版从代码层面的具体实现,以便大家在工作过程中更好使用开放签电子签章 ...
- Element UI的第一个程序(标签使用)
1:Element UI 官方文档:https://element.faas.ele.me/ 2:Element UI是什么? 网站快速成型工具 Element,一套为开发者.设计师和产品经理准备的基 ...
- Json Schema介绍 和 .net 下的实践 - 基于Lateapexearlyspeed.Json.Schema - 基础1 - type关键字和string类型
本系列旨在介绍Json Schema的常见用法,以及.net实现库Lateapexearlyspeed.Json.Schema的使用 这篇文章将介绍Json Schema中的type关键字,和stri ...
- 2023“强网杯”部分WP
强网先锋 SpeedUp 题目 我的解答: 分析代码可知是求2的27次方的阶乘的每一位的和. 使用在线网址直接查看:https://oeis.org/A244060/list 然后sha256加密 f ...