JavaScript模板方法模式:原理、实现与钩子函数详解
本文详解JavaScript中的模板方法模式,通过咖啡与茶的案例展示如何定义算法骨架。重点解析父类抽象、子类重写及钩子函数的应用,并提供基于原型继承与闭包两种实现方式的代码示例,帮助开发者理解算法复用与扩展机制。
模板方法模式概述
本文通过具体实例解析JavaScript中的模板方法模式,阐述其核心原理及实际应用方法,供读者参考学习。
模板方法模式是一种基于继承机制实现的简洁设计模式,旨在通过定义算法骨架来复用代码。
该模式主要包含两个组成部分:一是定义算法步骤的抽象父类,二是负责具体实现的子类。
以下以制作咖啡或茶的过程为例,说明模板方法模式的具体应用。
基于原型的实现
首先定义基础饮料类,代码如下:
var Beverage = function(){};
Beverage.prototype.boilWater = function(){
console.log('把水煮沸');
};
Beverage.prototype.pourInCup = function(){
throw new Error( '子类必须重写pourInCup' );
};
Beverage.prototype.addCondiments = function(){
throw new Error( '子类必须重写addCondiments方法' );
};
Beverage.prototype.customerWantsConditions = function(){
return true; //默认需要调料
};
Beverage.prototype.init = function(){
this.boilWater();
this.brew();
this.pourInCup();
if(this.customerWantsCondiments()){
//如果挂钩返回true,则需要调料
this.addCondiments();
}
};
接着创建子类并继承父类,实现具体逻辑。
var CoffeeWithHook = function(){};
CoffeeWithHook.prototype = new Beverage();
CoffeeWithHook.prototype.brew = function(){
console.log('把咖啡倒进杯子');
};
CoffeeWithHook.prototype.addCondiments = function(){
console.log('加糖和牛奶');
};
CoffeeWithHook.prototype.customerWantsCondiments = function(){
return window.confirm( '请问需要调料吗?' );
};
实例化对象并执行煮咖啡流程。
var coffeeWithHook = new CoffeeWithHook();
coffeeWithHook.init();
基于闭包的实现
此外,还可以采用另一种基于闭包的实现方式。
var Beverage = function( param ){
var boilWater = function(){
console.log( '把水煮沸' );
};
var brew = param.brew || function(){
throw new Error( '必须传递brew方法' );
};
var pourInCup = param.pourInCup || function(){
throw new Error( '必须传递pourInCup方法' );
};
var addCondiments = param.addCondiments || function(){
throw new Error( '必须传递addCondiments方法' );
};
var F = function(){};
F.prototype.init = function(){
boilWater();
brew();
pourInCup();
addCondiments();
};
return F;
};
var Coffee = Beverage({
brew: function(){
console.log( '用沸水冲泡咖啡' );
},
pourInCup: function(){
console.log('把咖啡倒进杯子');
},
addCondiments: function(){
console.log('加糖和牛奶');
}
});
var coffee = new Coffee();
coffee.init();
上述代码可通过在线HTML/CSS/JavaScript代码运行工具http://tools.jb51.net/code/HtmlJsRun进行测试。

如需了解更多JavaScript相关知识,可参考本站系列教程:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》。
希望本文的内容能对读者的JavaScript程序设计工作提供有益帮助。
JavaScript闭包与类(Class)的区别及适用场景对比
2026-11-05 15:48:57
JavaScript入门要学ES6吗?let与箭头函数等新特性解析
2026-11-05 14:49:16
JavaScript 8种数据类型详解:基本类型与引用类型的区别
2026-11-05 14:25:15
怎么在JavaScript中使用async/await优化Ajax异步流程
2026-11-05 13:56:15
JavaScript replace回调函数实现动态正则替换逻辑
2026-11-05 13:52:13
