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中的设计模式非常感兴趣,恰巧呢这几天公司的开发任务还不算太多,趁着有时间昨天又把模板方法模式深入学习了一下,做了一个客户在不同银行计息的小案例,感触颇深,今天给各位分享一 ...
随机推荐
- 34. 干货系列从零用Rust编写负载均衡及代理,异步测试在Rust中的实现
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...
- Educational Codeforces Round 26 Problem C
C. Two Seals time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- 中企网安信息科技:协同办公OA信息化管理系统概述
由华企网安总公司北京中企网安信息科技有限责任公司开发的<协同办公OA信息化管理系统>,获得国家版权局颁发的计算机软件著作权登记证书. 协同办公OA信息化管理系统是一种综合性的软件系统,用于 ...
- Python——第二章:列表的增、删、改、查
列表的添加 .append() lst = [] # 向列表末尾添加内容 # append() 追加 lst.append("张绍刚") lst.append("赵本山& ...
- 热闹的人工智能VS酷寒的资本寒冬,2023年AI Agent项目盘点与融资分析
2023年国内AI Agent下项目大盘点,科技大厂与创业公司齐头并进 热闹人工智能VS酷寒资本寒冬,2023年AI Agent项目盘点与融资分析 资本寒冬下的AIGC,为什么这些AI Agent项目 ...
- weblogic GC overhead limit exceeded
weblogic GC overhead limit exceeded 使用weblogic启动较大项目时,超出GC限制,可以通过修改 C:\Oracle\Middleware\Oracle_Home ...
- 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 12.认识GamePlayTag, 实现技能的互斥
斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章对应Lecture 17 - GameplayTags, 67.67节.本文将会讲述UE4中Gamepl ...
- 文心一言 VS 讯飞星火 VS chatgpt (25)-- 算法导论4.2 7题
七.设计算法,仅使用三次实数乘法即可完成复数 a+bi和c+di 相乘.算法需接收a.b.c和d 为输入,分别生成实部 ac-bd 和虚部ad+bc. 文心一言: 可以使用如下算法来计算复数 a+bi ...
- HDU 2144 Evolution 后缀树/后缀数组
HDU 2144 Evolution 后缀树/后缀数组 题意 给我们不到一百个字符串(长度不到一百)以及一个百分比q,然后如果某两个字符串的最长公共子串占比超过了q(在两个串中都超过)则两个串为一个集 ...
- npm install过程中遇到typings deprecated的warning该怎么处理
摘要:在项目里进行npm install操作的时候,发现typings.json文件里的一些定义文件爆出了已经弃用的警告,怎么办? 本文分享自华为云社区<npm install过程中遇到typi ...