深入理解JavaScript系列(27):设计模式之建造者模式详解


Posted in Javascript onMarch 03, 2015

介绍

在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。

建造者模式可以将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。也就是说如果我们用了建造者模式,那么用户就需要指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。

正文

这个模式相对来说比较简单,先上代码,然后再解释

function getBeerById(id, callback) {

    // 使用ID来请求数据,然后返回数据.

    asyncRequest('GET', 'beer.uri?id=' + id, function (resp) {

        // callback调用 response

        callback(resp.responseText);

    });

}
var el = document.querySelector('#test');

el.addEventListener('click', getBeerByIdBridge, false);
function getBeerByIdBridge(e) {

    getBeerById(this.id, function (beer) {

        console.log('Requested Beer: ' + beer);

    });

}

根据建造者的定义,表相即是回调,也就是说获取数据以后如何显示和处理取决于回调函数,相应地回调函数在处理数据的时候不需要关注是如何获取数据的,同样的例子也可以在jquery的ajax方法里看到,有很多回调函数(比如success, error回调等),主要目的就是职责分离。

同样再来一个jQuery的例子:

$('<div class= "foo"> bar </div>');

我们只需要传入要生成的HTML字符,而不需要关系具体的HTML对象是如何生产的。

总结

建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化,其优点是:建造者模式的“加工工艺”是暴露的,这样使得建造者模式更加灵活,并且建造者模式解耦了组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。

Javascript 相关文章推荐
JQuery 解析多维的Json数据格式
Nov 02 Javascript
jQuery Animation实现CSS3动画示例介绍
Aug 14 Javascript
CSS+jQuery实现的一个放大缩小动画效果
Sep 24 Javascript
JS正则表达式验证数字代码
Jan 28 Javascript
JS操作iframe里的dom(实例讲解)
Jan 29 Javascript
javascript中去除数组重复元素的实现方法【实例】
Apr 12 Javascript
JavaScript 性能提升之路(推荐)
Apr 10 Javascript
node.js实现带进度条的多文件上传
Mar 27 Javascript
javascript实现点击星星小游戏
Dec 24 Javascript
通过js随机函数Math.random实现乱序
May 19 Javascript
js实现验证码功能
Jul 24 Javascript
JavaScript实现HTML导航栏下拉菜单
Nov 25 Javascript
javascript验证身份证号
Mar 03 #Javascript
JS烟花背景效果实现方法
Mar 03 #Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
Mar 03 #Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
Mar 03 #Javascript
js+jquery常用知识点汇总
Mar 03 #Javascript
js实现宇宙星空背景效果的方法
Mar 03 #Javascript
Angular中的Promise对象($q介绍)
Mar 03 #Javascript
You might like
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
分享PHP守护进程类
2015/12/30 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
vue 父组件调用子组件方法及事件
2018/03/29 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
详谈python在windows中的文件路径问题
2018/04/28 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
物业管理计划书
2014/01/10 职场文书
关于保护环境的标语
2014/06/09 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
小学教师求职信范文
2015/03/20 职场文书
安全承诺书格式范本
2015/04/28 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers