当前位置: 首页 > news >正文

108、23种设计模式之模板方法模式(17/23)

一、定义

模板方法模式是一种行为型设计模式,它在抽象类中定义一个操作的算法骨架(模板方法),将算法中的某些步骤延迟到子类中实现。子类可以在不改变算法整体结构的情况下,重写特定步骤的实现细节。

核心思想:封装不变部分,扩展可变部分,通过抽象类固定算法流程,子类负责填充具体实现。

二、优缺点分析

1.优点:

(1)代码复用:将公共逻辑(不变步骤)集中在抽象类中,避免重复代码。
(2)行为控制:抽象类控制算法流程,子类仅负责具体实现,符合 “开闭原则”(对扩展开放,对修改关闭)。
(3)结构清晰:算法骨架明确,子类无需关心整体流程,只需专注于特定步骤。

2.缺点:

(1)灵活性限制:算法骨架被固定在抽象类中,若需修改整体流程,需修改抽象类,违反 “开闭原则”。
(2)子类膨胀:若可变步骤较多,可能导致子类数量激增,增加维护成本。

三、应用场景

(1)算法流程固定,但部分步骤实现可变:如框架中的生命周期方法(初始化、执行、销毁)。
(2)多个子类存在公共逻辑:可将公共逻辑提取到抽象类,子类仅实现差异部分。
(3)需要控制子类扩展:通过模板方法约束子类的行为,确保算法流程一致。
典型案例:

  • 框架中的初始化流程(如 Spring 的init-method)。
  • 测试框架中的用例执行流程( setup → test → teardown )。
  • 文档生成工具(固定格式,内容可变)。

四、C# 代码示例

以 “咖啡与茶的冲泡流程” 为例,两者流程相似( boiling water → brewing → pouring → adding condiments ),但具体步骤实现不同。

using System;// 抽象类:定义算法骨架(模板方法)
public abstract class Beverage
{// 模板方法:固定算法流程,用sealed防止子类重写public sealed void PrepareRecipe(){BoilWater();Brew();         // 抽象方法,子类实现PourInCup();AddCondiments(); // 抽象方法,子类实现}// 具体方法:公共步骤(不变部分)private void BoilWater(){Console.WriteLine("Boiling water");}private void PourInCup(){Console.WriteLine("Pouring into cup");}// 抽象方法:子类需实现的可变步骤protected abstract void Brew();protected abstract void AddCondiments();
}// 具体子类:咖啡
public class Coffee : Beverage
{protected override void Brew(){Console.WriteLine("Dripping coffee through filter");}protected override void AddCondiments(){Console.WriteLine("Adding sugar and milk");}
}// 具体子类:茶
public class Tea : Beverage
{protected override void Brew(){Console.WriteLine("Steeping the tea");}protected override void AddCondiments(){Console.WriteLine("Adding lemon");}
}// 客户端调用
class Program
{static void Main(string[] args){Beverage coffee = new Coffee();Console.WriteLine("Making coffee:");coffee.PrepareRecipe();Beverage tea = new Tea();Console.WriteLine("\nMaking tea:");tea.PrepareRecipe();}
}

输出结果:

Making coffee:
Boiling water
Dripping coffee through filter
Pouring into cup
Adding sugar and milkMaking tea:
Boiling water
Steeping the tea
Pouring into cup
Adding lemon

五、关键点总结

1.核心结构:

  • 抽象类(Abstract
    Class):定义模板方法(PrepareRecipe)和抽象步骤(Brew、AddCondiments),可包含具体公共方法(BoilWater)。
  • 具体子类(Concrete Class):继承抽象类,实现抽象步骤。

2.模板方法特性:

  • 通常用sealed修饰,防止子类修改算法流程。
  • 可包含 “钩子方法”(Hook Method):在抽象类中定义默认空实现,子类可选择重写(如添加额外逻辑)。

3.设计原则:

  • 符合 “里氏替换原则”:子类可替换父类,且不改变算法流程。
  • 体现 “依赖倒置原则”:客户端依赖抽象类(Beverage),而非具体子类。

4.与策略模式的区别:

  • 模板方法模式通过继承实现算法变化,强调流程固定、步骤可变。
  • 策略模式通过组合实现算法变化,强调整体算法的替换。

模板方法模式适用于流程标准化场景,能有效提升代码复用性和扩展性,是框架设计中常用的模式之一。

在这里插入图片描述

http://www.dtcms.com/a/465557.html

相关文章:

  • React 19.2.0: 新特性与优化深度解析
  • {【MySQL】深入解析InnoDB存储引擎的MVCC机制与实现原理}
  • 吉安哪家做网站的公司好html简单网站成品免费
  • 以太网PHY芯片全面解析:物理层核心、单多口设计与实战选型
  • 微网站怎么制作网站建设 起飞
  • Docker镜像仓库全方位使用指南
  • 做网站网络合同上海网站建设网站开发
  • Deep Neural Networks for YouTube Recommendation
  • Vue支持预览 docx格式,xlsx格式,pdf格式的文件
  • 海南工程建设资料备案网站抖音开放平台官网入口
  • WHAT - requestIdleCallback 介绍
  • ShadowDiffusion算法解决阴影去除问题
  • AWS CLI自动删除资源脚本
  • 嵌入式学习linux内核驱动6——dts和GPIO子系统
  • 企业网站推广哪家公司好揭阳做网站公司
  • 宿州做网站的公司有哪些广州自助公司建网站
  • 星巴克APP逆向
  • [Dify] 知识库在 Agent 模式中的应用策略:让智能体更懂知识、更懂业务
  • 精通C语言(4.四种动态内存有关函数)
  • 【实用工具】使用Python语言制作RSS阅读器
  • 动态规划 - 二维费用的背包问题、似包非包、卡特兰数
  • JAVA·方法的使用
  • 做rap的网站国内做网站网站风险大吗
  • 【代码随想录算法训练营——Day33】动态规划——62.不同路径、63.不同路径II、343.整数拆分、96.不同的二叉搜索树
  • 基于单片机的元胞自动机仿真系统设计
  • 星座运势网站技术解析:从零打造现代化Web应用
  • Asp.net core 跨域配置
  • Java学习之旅第二季-18:转型
  • 建筑物孪生模型:重构空间数字化格局,赋能智慧城市
  • Claude code、codex、gemini cli开启全自动(yolo)模式,无需审批