news 2026/6/25 3:46:13

设计模式之-模板模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式之-模板模式

模板方法模式是一种只需使用继承就可以实现的非常简单的模式

它由两部分构成,1.抽象父类2.具体实现子类。通常在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有的执行顺序,子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法。

来看一个咖啡与茶的例子

// 1.先泡一杯咖啡classCoffee{boilWater(){console.log('把水煮沸');}brewCoffeeGriends(){console.log('用沸水冲泡咖啡');}pourInCup(){console.log('把咖啡倒进杯子');}addSugarAndMilk(){console.log('加糖和牛奶');}init(){this.boilWater();this.brewCoffeeGriends();this.pourInCup();this.addSugarAndMilk();}}constcoffee=newCoffee();coffee.init();//2.泡一壶茶classTea{boilWater(){console.log('把水煮沸');}steepTeaBag(){console.log('用沸水浸泡茶叶');}pourInCup(){console.log('把茶水倒进杯子');}addLemon(){console.log('加柠檬');}init(){this.boilWater();this.steepTeaBag();this.pourInCup();this.addLemon();}}consttea=newCoffee();tea.init();

分离共同点

// 让我们忘记最开始创建的Coffee类和Tea类,现在可以创建一个抽象父类来表示泡一杯饮料的整个过程。abstractclassBeverage{boilWater(){console.log("把水煮沸");}abstractbrew():void;// 抽象方法,由子类重写abstractpourInCup():void;// 抽象方法,由子类重写abstractaddCondiments():void;// 抽象方法,由子类重写init(){this.boilWater();this.brew();this.pourInCup();this.addCondiments();}}// 现在来创建Coffee类和Tea类classCoffeeextendsBeverage{brew():void{console.log("用沸水冲泡咖啡");}pourInCup():void{console.log("把咖啡倒进杯子");}addCondiments():void{console.log("加糖和牛奶");}}classTeaextendsBeverage{brew():void{console.log("用沸水浸泡茶叶");}pourInCup():void{console.log("把茶水倒进杯子");}addCondiments():void{console.log("加柠檬");}}// 使用constcoffee=newCoffee();coffee.init();consttea=newTea();tea.init();

在上面的例子中,到底谁才是所谓的模版方法呢,答案是Beverage类中的init方法,该方法封装了子类算法框架,他作为一个算法模版,指导子类以何种顺序去执行那些方法,在init方法中算法内的每一个步骤都清楚地展示在我们面前。

这些算法框架在正常状态下是适用于大多数子类的,但如果有一些特别“个性”的子类呢?比如有一些客人喝咖啡不加调料(糖和牛奶),有什么半打可以让子类不受这个约束呢?那么钩子方法可以用来解决这个问题,放置钩子是隔离变化的一种常见手段。我们在父类中容易变化的地方放置钩子,钩子可以有一个默认的实现,究竟要不要“挂钩”,这由子类自行决定。

abstractclassBeverage{boilWater(){console.log("把水煮沸");}abstractbrew():void;// 抽象方法,由子类重写abstractpourInCup():void;// 抽象方法,由子类重写abstractaddCondiments():void;// 抽象方法,由子类重写customerWantsCondiments(){returntrue;// 默认需要调料}init(){this.boilWater();this.brew();this.pourInCup();if(this.customerWantsCondiments()){//如果挂钩返回true,则需要调料this.addCondiments();}}}// 现在来创建Coffee类和Tea类classCoffeeextendsBeverage{brew():void{console.log("用沸水冲泡咖啡");}pourInCup():void{console.log("把咖啡倒进杯子");}addCondiments():void{console.log("加糖和牛奶");}customerWantsCondiments(){returnwindow.confirm('请问需要调料吗?')}}classTeaextendsBeverage{brew():void{console.log("用沸水浸泡茶叶");}pourInCup():void{console.log("把茶水倒进杯子");}addCondiments():void{console.log("加柠檬");}}// 使用constcoffee=newCoffee();coffee.init();consttea=newTea();tea.init();

非原创,来源于javascript设计模式与开发实践 -曾探

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 12:41:24

智慧校园数据安全新挑战:数据库审计如何守护教育信息资产

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

作者头像 李华
网站建设 2026/6/24 4:03:49

算法题 连续整数求和

829. 连续整数求和 问题描述 给定一个正整数 n,返回可以表示为 连续正整数之和 的方案数。 示例: 输入: n 5 输出: 2 解释: 5 2 3,共2种表示方法(包括5本身)输入: n 9 输出: 3 解释: 9 9 4 5 2 3 4&#xff…

作者头像 李华
网站建设 2026/6/25 0:17:07

如何用数据透视足球:建立你的理性扫盘分析体系

在足球的世界里,我们常常依赖一种模糊的“感觉”:因为喜欢某位球星而坚信他的球队会赢,因为一场大胜而认为该队状态“火热”,或是因为一个诡异的盘口变化而心神不宁。然而,正是这种依赖直觉与碎片信息的“感觉流”判断…

作者头像 李华
网站建设 2026/6/22 9:26:13

为什么顶级团队都在关注Open-AutoGLM?(开源地址+实战部署指南)

第一章:为什么顶级团队都在关注Open-AutoGLM?在人工智能快速演进的当下,自动化大模型应用已成为企业提升研发效率和业务响应能力的核心路径。Open-AutoGLM 作为开源领域首个聚焦于通用语言模型自动化调用与编排的框架,正迅速吸引全…

作者头像 李华
网站建设 2026/6/14 4:44:48

Open-AutoGLM手机部署避坑指南:7个核心技巧助你绕开常见失败陷阱

第一章:Open-AutoGLM手机部署避坑指南概述在将 Open-AutoGLM 模型部署至移动端设备时,开发者常因环境配置、算力限制或模型兼容性问题遭遇失败。本章旨在系统梳理部署过程中高频出现的技术陷阱,并提供可落地的解决方案,帮助开发者…

作者头像 李华