模板方法模式(Template Method Pattern)
模式定义
定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
UML类图
- 抽象类(AbstractClass) 定义了一个或多个抽象操作(以便让子类实现)和一个调用这些方法的方法。这样就构成了一个框架。
- 具体类(ConcreteClass) 实现父类定义的抽象操作。
代码结构
public static class TemplateApp
{
public static void Run()
{
AbstractClass aA = new ConcreteClassA();
aA.TemplateMethod();
AbstractClass aB = new ConcreteClassB();
aB.TemplateMethod();
}
}
abstract class AbstractClass
{
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
public void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
}
}
class ConcreteClassA : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("ConcreteClassA.PrimitiveOperation1()");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("ConcreteClassA.PrimitiveOperation2()");
}
}
class ConcreteClassB : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("ConcreteClassB.PrimitiveOperation1()");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("ConcreteClassB.PrimitiveOperation2()");
}
}
情景案例
虽然离开了大学,但是学习不因间断。曾读过《如何高效学习》斯科特.扬,感觉收益颇多,有事情整理下自己度过的书分享一下。下面以《如何高效学习》中的学习吃饭模型为例,实现吃饭和学习。
public static class TemplateApp
{
public static void Run()
{
Mode dinner = new Dinner();
dinner.TemplateMethod();
Mode study = new Study();
study.TemplateMethod();
}
}
abstract class Mode
{
public abstract void Search();
public abstract void Decide();
public abstract void Wait();
public abstract void On();
public abstract void Apply();
public void TemplateMethod()
{
Search();
Decide();
Wait();
On();
Apply();
}
}
class Dinner : Mode
{
public override void Search()
{
Console.WriteLine("找东西吃");
}
public override void Decide()
{
Console.WriteLine("点菜");
}
public override void Wait()
{
Console.WriteLine("等菜");
}
public override void On()
{
Console.WriteLine("上菜");
}
public override void Apply()
{
Console.WriteLine("开吃");
}
}
class Study : Mode
{
public override void Search()
{
Console.WriteLine("获取信息");
}
public override void Decide()
{
Console.WriteLine("理解信息");
}
public override void Wait()
{
Console.WriteLine("扩展知识");
}
public override void On()
{
Console.WriteLine("知识纠错");
}
public override void Apply()
{
Console.WriteLine("应用知识");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)