[设计模式] javascript 之 模板方法模式
模板方法模式说明
定义:定义方法操作的骨架,把一些具体实现延伸到子类中去,使用得具体实现不会影响到骨架的行为步骤!
说明:模式方法模式是一个继承跟复用的典型模式,该模式定义了一个抽象类,Abstract Class,其下定义了一个或多个模板方法,也就是顶级方法,这些方法定义行为的调度步骤,一般是调用抽象中定义的其他具体类或勾子;定义了一些抽象方法,这些方法必须要由具体子类来实现;还有可能定义了一些勾子方法,这一般是空方法,用于子类扩展。
模板方法模式组成:
1>. 模板方法: 也叫骨架方法,定义行为调度步骤! 不能被子类修改,如果在java高级面向对象语言,一般会以 final 修饰!
2>. 抽象方法:待子类继承必须实现的方法;
3>. 具体方法:用于在抽象类中的顶级实现,一般也不能被覆盖修改,一般也会加上 final 修饰!
4>. 勾子方法: 一般为空方法. 方法命名一般以 “do” 开头,类似于 HttpServlet 下的 doGet, doPost;
模板方法模式,一般用于 具有相同行为逻辑过程,但各自实现不太一样的场景,这种情况就可以采用这种模式,定义骨架,规定如何去执行,顺序、调度等,再让子类各自去实具体的行为;
面向对象思想,要注意它不变跟变化的因素,在模板方法模式里,行业逻辑是不变的,行为具体实现是可变的,把可变跟不可变的分离使之解藕,这符合面向对象的开闭原则;定义抽象骨架,让具体实现以子类形式去自由扩展,互不影响。
模板模式结构图:
实例场景:
1>. 比如不同文件审批上呈过程,经过的人或部门是一样的,但每个过程他的处理是不一致的;
2>. 再比如说,大学四年,不同专业每年所修的课本是不太一样的;
实例源码
这里以读大学四年来实现;
1. 定义抽象类;
function AbstractClass() { } AbstractClass.prototype.template = function() { this.FirstYear(); this.SecondYear(); this.ThirdYear(); this.FourthYear(); } AbstractClass.prototype.FirstYear = function() { console.log('需要重写'); } AbstractClass.prototype.SecondYear = function() { console.log('需要重写'); } AbstractClass.prototype.ThirdYear = function() { console.log('需要重写'); } AbstractClass.prototype.FourthYear = function() { console.log('需要重写'); }
2. 定义某学生;
function Student(name) { this.name = name; } Student.prototype = AbstractClass.prototype; //继承 Student.prototype.FirstYear = function() { console.log(this.name+' 第一年修: 语文' ); } Student.prototype.SecondYear = function() { console.log(this.name+' 第二年修: 数学' ); } Student.prototype.ThirdYear = function() { console.log(this.name+' 第三年修: 英语' ); } Student.prototype.FourthYear = function() { console.log(this.name+' 第四年修: 历史' ); }
3. 使用方法:
var student = new Student('陈某某'); student.template();
输出:
陈某某 第一年修: 语文
陈某某 第二年修: 数学
陈某某 第三年修: 英语
陈某某 第四年修: 历史
其他说明
面向对象中的继承,一般把行为方法置于最顶层,把状态成员,置于子类当中;关注行为,而非状态;
模板方法模式是一个经常用到的模式,体现了面向对象经典的继承跟复用特点;用于关注固定的逻辑行为,骨架方法用于封装固定的逻辑过程,开发时要提取这部分统一的过程到抽象类中去,抽象与具体的设计师分工开发时就可以不受其他影响;
关健字:模板,继承,骨架;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!