关于模板方法模式我所知道的

简介: 关于模板方法模式我所知道的

image.png


持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

关键词:行为型 模板方法 template method

模板方法模式由两部分结构组成:抽象父类和具体的实现子类。

核心:父类中封装子类的公用方法,和方法的执行顺序(举例:react 组件的生命周期)。


解决什么问题?


如果对react有所了解的话,Component 就是模板方法模式最典型的案例。

模板方法模式有两大作用:复用和扩展。

复用是说,所有的子类可以复用父类中提供的模板方法。

扩展是说,在父类提供功能扩展点 hook,让子类可以在不重写修改父类的情况下,基于扩展点定制功能。


具体实践


模板方法模式建议将算法分解为一系列步骤, 然后将这些步骤改写为方法, 最后在 “模板方法” 中依次调用这些方法。

步骤可以是 抽象的, 也可以有一些默认的实现。 为了能够使用算法, 客户端需要自行提供子类并实现所有的抽象步骤。 如有必要还需重写一些步骤 (但这一步中不包括模板方法自身)。

  1. 抽象父类中的方法,有些子类由各个子类实现的 abstract,有些是选填的 final
  2. 可选步骤已有一些默认实现,在需要时可以进行重写
  3. hook 是内容为空的可选步骤。即使不重写 hook,模板方法也能工作。通常放置在重要步骤方法的前后,提供扩展点。


abstract class AbstractClass {
  // 模板方法
  public templateMethod(): void {
    this.create();
    this.customOperation();
    this.update();
    this.beforeMount();
    this.dealEffect();
    this.mount();
    this.mounted();
  }
  // 已经在父类中实现
  protected create(): void {
    console.log("父类执行函数 create");
  }
  protected update(): void {
    console.log("父类让子类覆盖执行操作 update");
  }
  protected mount(): void {
    console.log("父类执行函数 mount");
  }
  // 必须在子类实现的方法 - 业务定制
  protected abstract customOperation(): void;
  protected abstract dealEffect(): void;
  // 可选步骤,默认为空,放置在重要步骤方法的前后,提供扩展点
  protected beforeMount(): void {}
  protected mounted(): void {}
}
class ConcreteClass1 extends AbstractClass {
  protected customOperation(): void {
    console.log("子类1必填函数执行:customOperation");
  }
  protected dealEffect(): void {
    console.log("子类1必填函数执行:dealEffect");
  }
}
class ConcreteClass2 extends AbstractClass {
  protected customOperation(): void {
    console.log("子类2必填函数执行:customOperation");
  }
  protected dealEffect(): void {
    console.log("子类2必填函数执行:dealEffect");
  }
  protected beforeMount(): void {
    console.log("子类2执行hook beforeMount");
  }
}

测试代码:


function clientCode(abstractClass: AbstractClass) {
  abstractClass.templateMethod();
}
clientCode(new ConcreteClass1());
console.log("");
clientCode(new ConcreteClass2());
// 父类执行函数 create
// 子类1必填函数执行:customOperation
// 父类让子类覆盖执行操作 update
// 子类1必填函数执行:dealEffect
// 父类执行函数 mount
// 父类执行函数 create
// 子类2必填函数执行:customOperation
// 父类让子类覆盖执行操作 update
// 子类2执行hook beforeMount
// 子类2必填函数执行:dealEffect
// 父类执行函数 mount



应用场景


  • 方法执行顺序和步骤很固定,只有个别方法需要修改 abstract
  • 控制子类的扩展,父类只在特定点调用 hook,只允许在这些地方进行拓展。

当我们使用模板方法模式编写代码时,由父类控制哪些方法在什么时候被调用,子类只负责提供一些设计上的细节和方法。

参考资料

refactoringguru 模板方法模式

目录
相关文章
|
开发工具 git
git push 提交后撤回--图文详解
git push 提交后撤回--图文详解
403 1
|
分布式计算 大数据 Scala
【大数据技术Hadoop+Spark】Spark RDD创建、操作及词频统计、倒排索引实战(超详细 附源码)
【大数据技术Hadoop+Spark】Spark RDD创建、操作及词频统计、倒排索引实战(超详细 附源码)
614 1
|
9月前
|
SQL 弹性计算 安全
【上云基础系列04】基于标准架构的数据库升级
本文回顾了业务上云从基础到进阶的理念,涵盖基础版和全栈版架构。在“入门级:上云标准弹性架构基础版”的基础上,本文针对数据库升级,重点介绍了高可用数据库架构的升级方案,确保数据安全和业务连续性。最后,附有详细的“上云标准弹性架构”演进说明,帮助用户选择合适的架构方案。
|
7月前
|
JSON 测试技术 API
大模型工程师基础之学会使用openai
本系列教程涵盖OpenAI API基础到高级应用,包括文本生成、图像处理、语音交互、会话管理、流式响应、文件输入、推理模型及性能评估等十大核心功能。适合新手入门与工程师实践,助您掌握大模型开发关键技术。从简单Prompt设计到复杂多模态任务,逐步深入,结合实例代码与最佳实践,提升实际开发能力。希望这些内容对您有帮助!
712 11
|
11月前
|
机器学习/深度学习 自然语言处理 算法
通义灵码在金融与教育领域的应用
通义灵码在金融与教育领域的应用展现了其强大潜力。在金融行业,它通过优化风险评估、智能投顾及交易算法,提升业务效率与安全性;在教育领域,则通过个性化学习方案、智能化教学资源生成及编程教育辅助,革新教学方式,满足多样化需求,为行业注入新活力。
|
缓存 JavaScript 开发者
网页离线缓存 Service Worke
网页离线缓存 Service Worke
512 4
|
消息中间件 网络协议 Java
消息中间件-ActiveMQ
消息中间件-ActiveMQ
|
应用服务中间件 nginx
Docsify——部署后显示404且无法访问README.md
Docsify——部署后显示404且无法访问README.md
231 0
|
前端开发 JavaScript NoSQL
全套检验系统(LIS)源码 云LIS系统源码 区域医疗云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件。这套系统通常与其他信息系统比如医院信息系统(HIS)连接。实验室信息系统由多种实验室流程模块构成,这些模块可以依据客户的实际情况进行选择和配置。选择适合的实验室信息系统对于使用者非常重要,往往要通过几个月的研究和计划。系统的安装调试对于不同的研究阶段也从几周到几个月不等,实验室的研究工作有多少种就有多少种实验室信息系统。大型的实验室信息系统几乎包括了所有的实验室研究的学科内容,比如血液学、化学、免疫学、血库、外科病理学、解剖病理学、在线细胞计数和微生物学。这个条目将说明临
278 2
|
分布式计算 DataWorks 关系型数据库
MaxCompute产品使用合集之在DataWorks中,怎么创建空间并绑定MaxCompute引擎,然后创建项目
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。