JavaScript模板方法模式:原理、实现与钩子函数详解

作者:半夏

时间:2026-10-22

浏览:135

本文详解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程序设计工作提供有益帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章