模板方法模式属于行为型设计模式,它的核心逻辑是在抽象父类中定义一个模板方法,这个模板方法规定了算法的整体执行步骤和顺序,而其中部分可变的步骤则定义为抽象的或者虚的方法,留给子类去具体实现,这样既保证了算法骨架的统一,又允许子类根据自身需求定制部分步骤的逻辑。

模板方法模式的核心角色
模板方法模式主要包含两类角色:
- 抽象父类:定义模板方法和抽象的步骤方法,模板方法规定了算法的执行流程,步骤方法则是需要子类实现的可变逻辑。
- 具体子类:继承抽象父类,实现父类中定义的抽象步骤方法,或者重写父类的虚步骤方法,完成自身特有的逻辑。
C#实现模板方法模式的基本步骤
1. 定义抽象父类
首先在抽象父类中定义模板方法,模板方法通常是公共的非虚方法,避免子类修改算法的整体流程。然后定义需要子类实现的抽象步骤方法,或者可以提供默认实现的虚方法。
using System;
// 抽象父类,定义数据处理的算法骨架
public abstract class DataProcessor
{
// 模板方法,定义算法的整体流程,声明为public和sealed,防止子类修改流程
public void ProcessData()
{
Console.WriteLine("开始执行数据处理流程");
ReadData();
ProcessCoreData();
SaveData();
Console.WriteLine("数据处理流程执行结束");
}
// 读取数据步骤,定义为抽象方法,子类必须实现
protected abstract void ReadData();
// 核心处理数据步骤,定义为虚方法,子类可以选择重写,也可以使用默认实现
protected virtual void ProcessCoreData()
{
Console.WriteLine("使用默认方式处理核心数据");
}
// 保存数据步骤,定义为抽象方法,子类必须实现
protected abstract void SaveData();
}
2. 实现具体子类
具体子类继承抽象父类,实现父类中的抽象步骤方法,根据需要重写虚方法,完成自身的业务逻辑。
// 文件数据处理子类
public class FileDataProcessor : DataProcessor
{
protected override void ReadData()
{
Console.WriteLine("从本地文件中读取数据");
}
protected override void ProcessCoreData()
{
Console.WriteLine("对文件数据进行格式校验和清洗处理");
}
protected override void SaveData()
{
Console.WriteLine("将处理后的文件数据保存到指定目录");
}
}
// 数据库数据处理子类
public class DatabaseDataProcessor : DataProcessor
{
protected override void ReadData()
{
Console.WriteLine("从数据库表中读取数据");
}
// 使用父类的默认核心处理逻辑,不需要重写ProcessCoreData方法
protected override void SaveData()
{
Console.WriteLine("将处理后的数据回写到数据库表中");
}
}
3. 客户端调用示例
客户端只需要创建具体的子类实例,调用模板方法即可,不需要关心算法内部的执行步骤,也不需要了解子类的具体实现细节。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("执行文件数据处理:");
DataProcessor fileProcessor = new FileDataProcessor();
fileProcessor.ProcessData();
Console.WriteLine("n执行数据库数据处理:");
DataProcessor dbProcessor = new DatabaseDataProcessor();
dbProcessor.ProcessData();
}
}
模板方法模式的适用场景
在以下场景中可以考虑使用模板方法模式:
- 多个子类有共同的算法流程,只有部分步骤的实现不同,需要减少重复代码。
- 需要控制子类的扩展点,只允许子类修改算法的部分步骤,不允许修改整体流程。
- 需要复用算法的固定结构,同时给不同场景下的子类提供定制化的实现逻辑。
注意事项
使用模板方法模式时需要注意,模板方法尽量不要定义为虚方法或者抽象方法,避免子类修改算法的整体执行流程,破坏模式的设计初衷。另外,抽象步骤方法的访问修饰符通常设置为protected,只允许子类访问,不对外暴露。如果某些步骤有默认实现,但是子类可以按需修改,可以将其定义为虚方法,否则定义为抽象方法强制子类实现。
模板方法模式的核心价值是封装不变部分,扩展可变部分,通过父类控制流程,子类实现细节,符合开闭原则,也提升了代码的复用性和可维护性。
C#Template_Method设计模式算法骨架修改时间:2026-06-08 19:33:23