.NET 设计模式—模板方法模式(Template Method Pattern)

简介

模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),是一种行为设计模式,它定义了一个操作中的算法框架,将某些步骤的具体实现留给子类。通过模板方法模式,我们可以在不改变算法结构的情况下,允许子类重新定义某些步骤,从而实现代码复用和扩展。

在软件开发中,我们经常会遇到需要定义一组相似操作的场景。这些操作可能在整体上有着相同的结构,但在细节上有所差异。如果每次都重复编写这些操作的通用结构,会导致代码的冗余性,同时也增加了后期维护的难度。为了解决这个问题,模板方法模式应运而生。

角色

  • 抽象类(Abstract Class):抽象类定义了算法的框架,包括一个或多个抽象方法和具体方法。其中的抽象方法由子类实现,具体方法可以被子类直接继承或重写。
  • 具体子类(Concrete Subclass):具体子类继承抽象类,并根据需要实现其中的抽象方法。具体子类提供了算法的具体实现细节。

优点

  • 代码复用:模板方法模式通过将算法的通用结构定义在抽象类中,可以使子类直接继承这些通用部分,从而达到代码复用的目的。
  • 扩展性:模板方法模式允许子类根据需要重写父类的某些步骤,从而实现对算法的自由扩展和修改,同时保持整体结构的稳定性。
  • 封装性:模板方法模式将算法的实现细节封装在抽象类中,对调用者屏蔽了具体的实现细节,只暴露出高层接口。

缺点

  • 模板方法模式将算法的执行流程固定在抽象类中,可能会导致代码的可读性降低,增加理解和维护的难度。
  • 模板方法中的步骤越多, 其维护工作就可能会越困难。
  • 通过子类抑制默认步骤实现可能会导致违反里氏替换原则。

应用场景

  • 当存在一组相似的操作,它们具有相同的算法结构,但实现细节各不相同时。
  • 当希望在不改变算法的整体结构的情况下,允许子类自由扩展或修改某些步骤时。
  • 当希望将算法的实现细节封装起来,只暴露出高层接口供调用者使用时。

实现

  • 定义一个抽象类或接口作为基类,其中包含模板方法以及一些抽象方法或虚方法
cs 复制代码
public abstract class TemplateMethodPattern
{
    // 模板方法
    public final void TemplateMethod()
    {
        Console.WriteLine("执行固定步骤1...");
        ConcreteMethod(); // 调用抽象方法或虚方法
        Console.WriteLine("执行固定步骤2...");
    }
 
    // 抽象方法或虚方法,子类需要实现这些方法以提供具体逻辑
    protected abstract void ConcreteMethod();
}
  • 创建具体的子类并实现抽象方法或虚方法
cpp 复制代码
public class ConcreteClassA : TemplateMethodPattern
{
    // 实现抽象方法或虚方法
    protected override void ConcreteMethod()
    {
        Console.WriteLine("子类A的具体实现步骤...");
    }
}
 
public class ConcreteClassB : TemplateMethodPattern
{
    protected override void ConcreteMethod()
    {
        Console.WriteLine("子类B的具体实现步骤...");
    }
}
  • 上层应用调用
cs 复制代码
class Program
{
    static void Main(string[] args)
    {
        ConcreteClassA concreteClassA = new ConcreteClassA();
        concreteClassA.TemplateMethod(); // 输出固定步骤和子类A的具体实现步骤
        
        ConcreteClassB concreteClassB = new ConcreteClassB();
        concreteClassB.TemplateMethod(); // 输出固定步骤和子类B的具体实现步骤
    }
}

在这个案例中,TemplateMethodPattern 类定义了一个模板方法 TemplateMethod,它包含了一些固定的步骤以及一个抽象方法 ConcreteMethod。子类 ConcreteClassAConcreteClassB 分别实现了 ConcreteMethod 方法以提供它们自己的具体逻辑。当调用 TemplateMethod 时,固定的步骤会执行,然后调用子类提供的具体实现。这样,你就可以确保算法的某些步骤始终被执行,同时允许子类根据需要提供额外的实现。

相关推荐
IT机器猫21 分钟前
RabbitMQ基础二
java·spring boot·分布式·spring cloud·log4j·rabbitmq·springamqp
阿部多瑞 ABU29 分钟前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
卷心菜的学习路31 分钟前
基于 Spring Cloud Tencent 元数据路由实现个人开发泳道,告别频繁部署
java·spring cloud
条形码D1 小时前
DRG综合管理分析系统-目前已经支持CHS-DRG3.0
c#·drg·3.0分组器·drg分组器·chs-drg3.0分组器
xieliyu.1 小时前
UPD协议结构以及开发中注意事项
java·开发语言·笔记·java-ee
张宇Joaquin1 小时前
openEuler编译和更换内核的方法
java·linux·服务器
程序员黑豆1 小时前
Java正则表达式详解
java·前端·ai编程
Flynt2 小时前
我试了Spring Boot 4的原生镜像,聊聊那些数字和坑
java·spring boot
M-Robots echo9 小时前
轻量化裁剪方案解析:M-Robots 模块化构建,适配高低端各类机器人硬件平台
java·机器人·ros·开源社区·atomgit·m-robots
不可求~10 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库