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

设计模式-模板模式

简介

模板方法模式是一种行为设计模式,它在父类中定义了一个操作的算法框架,允许子类在不改变算法结构的情况下重定义算法的某些步骤。这种模式是基于继承的,通过抽象类将通用的代码抽取到超类中,同时通过具体类实现或者改写算法中的某些特定步骤

核心思想

  • 定义模板结构:在超类中定义一个模板方法,这个方法将各个步骤的执行顺序固定下来,形成一个框架。
  • 延迟到子类实现:将一些步骤的具体实现延迟到子类中,使得子类可以在不改变算法结构的条件下改变这些步骤的行为。

使用场景

  • 当多个类中存在共同的行为,且这些行为在高层算法中的顺序已经确定,但各个步骤的具体实现可能不同时。
  • 当需要控制子类扩展的点时,模板方法只在特定点调用“钩子”操作,这样就只允许在这些点进行扩展

具体实现

假设我们有一个Game类,这个类定义了一个游戏的基本结构,包括初始化、开始游戏、结束游戏等步骤。我们将使用模板方法模式来定义这些步骤的结构,同时允许子类定义这些步骤的具体实现。

class Game {// 模板方法play() {this.initialize();this.startPlay();this.endPlay();}initialize() {// 默认实现,可以被子类重写console.log("Initializing game...");}startPlay() {// 这个方法应由子类实现throw new Error("Method 'startPlay()' must be implemented.");}endPlay() {// 默认实现,可以被子类重写console.log("Ending game...");}
}

然后,我们可以创建具体的游戏类,它们继承自Game类并实现自己的startPlay方法

class Chess extends Game {initialize() {super.initialize();console.log("Setting up a chess game.");}startPlay() {console.log("Starting a chess game.");}endPlay() {super.endPlay();console.log("Chess game finished.");}
}class Soccer extends Game {initialize() {super.initialize();console.log("Setting up a soccer match.");}startPlay() {console.log("Starting a soccer match.");}endPlay() {super.endPlay();console.log("Soccer match finished.");}
}

客户端代码现在可以使用这些类来玩游戏

const chess = new Chess();
chess.play();  // 使用Chess类中定义的具体方法const soccer = new Soccer();
soccer.play();  // 使用Soccer类中定义的具体方法

总结

  • 模板方法模式在JavaScript中可以用来定义一个操作中的算法骨架,同时允许子类提供某些步骤的具体实现。
  • 这种模式可以帮助我们将复杂类的通用行为抽象化,同时提供足够的灵活性来在子类中定义特定的行为。
  • 这种方法很适合用于定义框架或库的基本功能,同时允许用户通过继承来扩展或修改这些功能。
http://www.lryc.cn/news/389687.html

相关文章:

  • 物理删除和逻辑删除区别
  • C# 警告 warning MSB3884: 无法找到规则集文件“MinimumRecommendedRules.ruleset”
  • Lua网站开发之文件表单上传
  • 千益畅行,旅游卡,如何赚钱?
  • Element-plus点击当前行之后获取数据显示跟随行数据
  • Docker与微服务实战2022 尚
  • Spring @Cacheable缓存注解用法说明
  • Redis如何实现主从复制
  • 正则表达式以及文本三剑客grep、sed、awk
  • HSRP热备份路由协议(VRRP虚拟路由冗余协议)配置以及实现负载均衡
  • 不同集成学习算法的比较:随机森林、AdaBoost、XGBoost、LightGBM
  • 【聊聊原子性,中断,以及nodejs中的具体示例】
  • 常见网络端口号
  • 【数值计算库-超长笔记】Python-Mpmath库:高精度数值计算
  • 昇思25天学习打卡营第6天|函数式自动微分
  • 作业7.2
  • PCL 点云聚类(基于体素连通性)
  • python自动化运维--DNS处理模块dnspython
  • 成人职场商务英语学习柯桥外语学校|邮件中的“备注”用英语怎么说?
  • AndroidStudio报错macMissing essential plugin
  • doris集群物理部署保姆级教程
  • 探囊取物之多形式登录页面(基于BootStrap4)
  • 【ONLYOFFICE】| 桌面编辑器从0-1使用初体验
  • 20、PHP字符串的排列(含源码)
  • Linux 标准IO的fopen和fclose
  • 一个计算密集小程序在不同CPU下的表现
  • 圈子系统搭建教程,以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP小程序H5
  • 递归算法练习
  • WebDriver 类的常用属性和方法
  • 基于x86+FPGA+AI轴承缺陷视觉检测系统,摇枕弹簧智能检测系统