C# 设计模式(行为型模式):模板方法模式

C# 设计模式(行为型模式):模板方法模式

在开发过程中,我们经常会遇到一类问题:一些操作的整体步骤是固定的,但某些具体步骤的实现会因为场景不同而有所变化。模板方法模式(Template Method Pattern)是一种行为型设计模式,能够很好地解决这类问题。

模板方法模式的定义

模板方法模式定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义某些步骤的实现。它通过将算法的可变部分延迟到子类中,使代码的复用性更高,扩展性更好。

模板方法模式的结构

模板方法模式包括以下角色:

  1. AbstractClass(抽象类): 定义算法的骨架,包括模板方法和抽象方法。
  2. ConcreteClass(具体子类): 实现抽象方法,提供特定的逻辑。

示例:咖啡和茶的制作流程

我们以制作咖啡和茶为例,两者的制作步骤相似,但某些具体操作不同:

  1. 烧水。
  2. 冲泡饮品(咖啡或茶)。
  3. 倒入杯中。
  4. 添加配料(糖、牛奶或柠檬)。

代码实现

csharp 复制代码
using System;

// 抽象类:饮品制作模板
public abstract class BeverageTemplate
{
    // 模板方法:定义制作流程
    public void PrepareBeverage()
    {
        BoilWater();
        Brew();
        PourInCup();
        AddCondiments();
    }

    // 通用步骤:烧水
    private void BoilWater()
    {
        Console.WriteLine("烧水中...");
    }

    // 通用步骤:倒入杯中
    private void PourInCup()
    {
        Console.WriteLine("将饮品倒入杯中。");
    }

    // 抽象方法:冲泡饮品
    protected abstract void Brew();

    // 抽象方法:添加配料
    protected abstract void AddCondiments();
}

// 具体类:咖啡
public class Coffee : BeverageTemplate
{
    protected override void Brew()
    {
        Console.WriteLine("用热水冲泡咖啡。");
    }

    protected override void AddCondiments()
    {
        Console.WriteLine("添加糖和牛奶。");
    }
}

// 具体类:茶
public class Tea : BeverageTemplate
{
    protected override void Brew()
    {
        Console.WriteLine("用热水浸泡茶叶。");
    }

    protected override void AddCondiments()
    {
        Console.WriteLine("添加柠檬。");
    }
}

// 测试代码
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("制作咖啡:");
        BeverageTemplate coffee = new Coffee();
        coffee.PrepareBeverage();

        Console.WriteLine();

        Console.WriteLine("制作茶:");
        BeverageTemplate tea = new Tea();
        tea.PrepareBeverage();
    }
}

输出结果

复制代码
制作咖啡:
烧水中...
用热水冲泡咖啡。
将饮品倒入杯中。
添加糖和牛奶。

制作茶:
烧水中...
用热水浸泡茶叶。
将饮品倒入杯中。
添加柠檬。

模板方法模式的优缺点

优点

  1. 代码复用性高: 提取通用代码到抽象类中,避免重复代码。
  2. 灵活性强: 子类可以灵活实现具体步骤,而无需改变算法结构。
  3. 遵循开闭原则: 新增具体实现时,只需添加新子类,无需修改抽象类。

缺点

  1. 继承关系局限: 如果抽象类发生变化,所有子类都需要修改。
  2. 子类数量增加: 每个具体实现都需要一个子类。

适用场景

  1. 一个操作有固定的步骤,但某些步骤需要子类定制化实现。
  2. 有多个类的行为逻辑相似,但在细节实现上有所不同。

总结

模板方法模式是将不变的行为放在父类中,具体的实现延迟到子类中,从而实现了代码复用和灵活扩展。在实际开发中,例如工作流引擎、报表生成等场景,都可以看到模板方法模式的身影。

相关推荐
淡海水9 小时前
02-07-原理篇-GC暂停时间的本质
开发语言·unity·c#·gc·暂停时间
小羊没烦恼!11 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
范中勤13 小时前
技术文档:模型工厂 `llm_provider` / `llm_use` 分层设计
设计模式·langchain·架构设计·模型工厂·llm_provider
Behavior13 小时前
Unity 7.0 Alpha 拆解:编辑器干掉 Mono 换 CoreCLR
c#·unity3d·游戏开发
淡海水13 小时前
02-06-原理篇-增量式GC与并发GC
算法·unity·c#·并发·gc·增量
Vertira14 小时前
C# 函数封装成 DLL,
开发语言·c#
浅尝辄止;15 小时前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#
范中勤15 小时前
适配器模式(Adapter Pattern):原理、场景与 LLM 多厂商工程落地
设计模式·架构·langchain·适配器模式·多厂商
kimloner1 天前
开源一个 376KB 的 Windows 桌面小工具:便签 + 截图标注 + OCR + 待办提醒(C# / WinForms)
windows·开源·c#·ocr·winforms
阿松爱学习1 天前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#