学习JavaScript设计模式之模板方法模式


一、定义

模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。 java中的抽象父类、子类
模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。

二、示例

Coffee or Tea
(1) 把水煮沸
(2) 用沸水浸泡茶叶
(3) 把茶水倒进杯子
(4) 加柠檬

/* 抽象父类:饮料 */
var Beverage = function(){};
// (1) 把水煮沸
Beverage.prototype.boilWater = function() {
  console.log("把水煮沸");
};
// (2) 沸水浸泡
Beverage.prototype.brew = function() {
  throw new Error("子类必须重写brew方法");
};
// (3) 倒进杯子
Beverage.prototype.pourInCup = function() {
  throw new Error("子类必须重写pourInCup方法");
};
// (4) 加调料
Beverage.prototype.addCondiments = function() {
  throw new Error("子类必须重写addCondiments方法");
};

/* 模板方法 */
Beverage.prototype.init = function() {
  this.boilWater();
  this.brew();
  this.pourInCup();
  this.addCondiments();
}

/* 实现子类 Coffee*/
var Coffee = function(){};
Coffee.prototype = new Beverage();
// 重写非公有方法
Coffee.prototype.brew = function() {
  console.log("用沸水冲泡咖啡");
};
Coffee.prototype.pourInCup = function() {
  console.log("把咖啡倒进杯子");
};
Coffee.prototype.addCondiments = function() {
  console.log("加牛奶");
};
var coffee = new Coffee();
coffee.init();

通过模板方法模式,在父类中封装了子类的算法框架。这些算法框架在正常状态下是适用大多数子类的,但也会出现“个性”子类。
如上述流程,加调料是可选的。
钩子方法可以解决这个问题,放置钩子是隔离变化的一种常见手段。

/* 添加钩子方法 */
Beverage.prototype.customerWantsCondiments = function() {
  return true;
};
Beverage.prototype.init = function() {
  this.boilWater();
  this.brew();
  this.pourInCup();
  if(this.customerWantsCondiments()) {
    this.addCondiments();
  }
}

/* 实现子类 Tea*/
var Tea = function(){};
Tea.prototype = new Beverage();
// 重写非公有方法
Tea.prototype.brew = function() {
  console.log("用沸水冲泡茶");
};
Tea.prototype.pourInCup = function() {
  console.log("把茶倒进杯子");
};
Tea.prototype.addCondiments = function() {
  console.log("加牛奶");
};
Tea.prototype.customerWantsCondiments = function() {
  return window.confirm("需要添加调料吗?");
};
var tea = new Tea();
tea.init();

JavaScript没有提供真正的类式继承,继承是通过对象与对象之间的委托来实现的。

三、“好莱坞原则”:别调用我们,我们会调用你

典型使用场景:

(1)模板方法模式:使用该设计模式意味着子类放弃了对自己的控制权,而是改为父类通知子类。作为子类,只负责提供一些设计上的细节。
(2)观察者模式:发布者把消息推送给订阅者。
(3)回调函数:ajax异步请求,把需要执行的操作封装在回调函数里,当数据返回后,这个回调函数才被执行。

希望本文所述对大家学习javascript程序设计有所帮助。



相关阅读:
thinkphp配置文件路径的实现方法
Java中for、while、do while三种循环语句的区别介绍
php定界符<<<使用技巧和实例
javascript中闭包(Closure)详解
简介JavaScript中Math.LOG10E属性的使用
Win7系统怎么关闭硬件加速?Win7关闭硬件加速的方法
Java函数式编程(二):集合的使用
Redhat 6.2 下 oracle 11g R2的安装详解
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
PHP中error_reporting()用法详解
Android中Glide加载库的图片缓存配置究极指南
如何调试报表插件
Js可拖拽放大的层拖动特效实现方法
基于JavaScript实现div层跟随滚动条滑动
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 空白简历模板 小学五年级作文450字:给奥组委的一封信 夜的男人 小学五年级作文450字:懂得感恩 爱如流沙,用雪花埋葬一生的伤痛记忆 也只有在思念的时候,孤独才显得特别美丽 2014行政工作总结 重阳节里话重阳 129国际反腐败日演讲稿 加个QQ、测个试、、 企业治乱减负检查工作总结 一篇成功述职报告的写作要点阐述 妈妈的绝招作文350字 关于香蕉的哲理_经典香蕉哲学语录29句 方法与感悟 渡过挫折之河 著名的旅游景点作文 交通系统演讲稿《撑起一片洁净的蓝天》 美容院客户联谊会致辞 高考路上,复习生在努力。。。 千字文 泪之水晶(1)作文300字 代理招聘人协议 研究室新员工个人年终总结 国庆62周年颂祖国演讲稿 童心同在 成功男人的特点,你占了几条? 坚持以纳税人为本提高税收服务效能 从此是回忆 从彼是心情 五一计划英语作文 《生死攸关的烛光》教案3 电话机 论未成年人犯罪公诉制度的构建与完善 个人工作总结学校保卫工作 论文作文3000字 【花?油?宋摹?lt;你好,再?(CP夜元)作文800字 2011-2012学年度第二学期教科研工作总结 红鲤鱼打官司450字 《谁动了我的奶酪》有感650字 记忆的风帆,随风飘荡。 妈妈的家乡____乳山300字 船过水无痕作文 关于父爱的细节描写 2015农行财务个人工作总结范文 两只小猴子350字 描写古代花园的句子 走进花园的大门 南瓜饼和红枣糕作文1600字 晴天永远;十——原创长篇小说连载作文1400字 初中初二作文350字:战争与和平 轮回的流转

Copyright © 2016 phpStudy |