深入理解JavaScript系列(41):设计模式之模板方法详解


Posted in Javascript onMarch 04, 2015

介绍

模板方法(TemplateMethod)定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

模板方法是一种代码复用的基本技术,在类库中尤为重要,因为他们提取了类库中的公共行为。模板方法导致一种反向的控制结构,这种结构就是传说中的“好莱坞法则”,即“别找找我们,我们找你”,这指的是父类调用一个类的操作,而不是相反。具体体现是面向对象编程编程语言里的抽象类(以及其中的抽象方法),以及继承该抽象类(和抽象方法)的子类。

正文

举个例子,泡茶和泡咖啡有同样的步骤,比如烧开水(boilWater)、冲泡(brew)、倒在杯子里(pourOnCup),加小料(addCondiments)等等。但每种饮料冲泡的方法以及所加的小料不一样,所以我们可以利用模板方法实现这个主要步骤。

首先先来定义抽象步骤:

var CaffeineBeverage = function () {
};

CaffeineBeverage.prototype.prepareRecipe = function () {

    this.boilWater();

    this.brew();

    this.pourOnCup();

    if (this.customerWantsCondiments()) {

        // 如果可以想加小料,就加上

 this.addCondiments();

    }

};

CaffeineBeverage.prototype.boilWater = function () {

    console.log("将水烧开!");

};

CaffeineBeverage.prototype.pourOnCup = function () {

    console.log("将饮料到再杯子里!");

};

CaffeineBeverage.prototype.brew = function () {

    throw new Error("该方法必须重写!");

};

CaffeineBeverage.prototype.addCondiments = function () {

    throw new Error("该方法必须重写!");

};

// 默认加上小料

CaffeineBeverage.prototype.customerWantsCondiments = function () {

    return true;

};

该函数在原型上扩展了所有的基础步骤,以及主要步骤,冲泡和加小料步骤没有实现,供具体饮料所对应的函数来实现,另外是否加小料(customerWantsCondiments )默认返回true,子函数重写的时候可以重写该值。

下面两个函数分别是冲咖啡和冲茶所对应的函数:

// 冲咖啡

var Coffee = function () {

    CaffeineBeverage.apply(this);

};

Coffee.prototype = new CaffeineBeverage();

Coffee.prototype.brew = function () {

    console.log("从咖啡机想咖啡倒进去!");

};

Coffee.prototype.addCondiments = function () {

    console.log("添加糖和牛奶");

};

Coffee.prototype.customerWantsCondiments = function () {

    return confirm("你想添加糖和牛奶吗?");

};
//冲茶叶

var Tea = function () {

    CaffeineBeverage.apply(this);

};

Tea.prototype = new CaffeineBeverage();

Tea.prototype.brew = function () {

    console.log("泡茶叶!");

};

Tea.prototype.addCondiments = function () {

    console.log("添加柠檬!");

};

Tea.prototype.customerWantsCondiments = function () {

    return confirm("你想添加柠檬嘛?");

};

另外使用confirm,可以让用户自己选择加不加小料,很不错,不是嘛?

总结

模板方法应用于下列情况:

1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
2.各子类中公共的行为应被提取出来并集中到一个公共父类中的避免代码重复,不同之处分离为新的操作,最后,用一个钓鱼这些新操作的模板方法来替换这些不同的代码
3.控制子类扩展,模板方法只在特定点调用“hook”操作,这样就允许在这些点进行扩展

和策略模式不同,模板方法使用继承来改变算法的一部分,而策略模式使用委托来改变整个算法。

Javascript 相关文章推荐
javascript的对话框详解与参数
Mar 08 Javascript
用 JSON 处理缓存
Apr 27 Javascript
用Javascript数组处理多个字符串的连接问题
Aug 20 Javascript
分享20款好玩的jQuery游戏
Apr 17 Javascript
JS分页控件 可用于无刷新分页
Jul 23 Javascript
JS实现表格数据各种搜索功能的方法
Mar 03 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
Mar 30 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
Nov 03 Javascript
elementui的默认样式修改方法
Feb 23 Javascript
JS实现中英文混合文字溢出友好截取功能
Aug 06 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
Jun 21 Javascript
原生js实现点击按钮复制内容到剪切板
Nov 19 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
Mar 04 #Javascript
百度地图自定义控件分享
Mar 04 #Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
Mar 04 #Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
Mar 04 #Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
Mar 04 #Javascript
教你如何使用firebug调试功能了解javascript闭包和this
Mar 04 #Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
Mar 04 #Javascript
You might like
php adodb分页实现代码
2009/03/19 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
jQuery 常见学习网站与参考书
2009/11/09 Javascript
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
python获取文件扩展名的方法
2015/07/06 Python
Python实现的下载网页源码功能示例
2017/06/13 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
浅析Python 序列化与反序列化
2020/08/05 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
数控加工专业毕业生自荐信
2013/09/27 职场文书
退休感言
2014/01/28 职场文书
文秘人员工作职责
2014/01/31 职场文书
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
学校食堂标语
2014/10/06 职场文书
2014光棍节大学生联谊活动方案
2014/10/10 职场文书
新郎新娘答谢词
2015/01/04 职场文书
清洁工工作总结
2015/08/11 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python