深入理解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 相关文章推荐
Javascript MD4
Dec 20 Javascript
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
Feb 15 Javascript
jquery multiSelect 多选下拉框
Jul 09 Javascript
jquery中each方法示例和常用选择器
Jul 08 Javascript
js小数计算小数点后显示多位小数的实现方法
May 30 Javascript
深入浅析knockout源码分析之订阅
Jul 12 Javascript
JavaScript实现的微信二维码图片生成器的示例
Oct 26 Javascript
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
Feb 02 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
May 17 Javascript
JavaScrip关于创建常量的知识点
Dec 07 Javascript
Vue页面跳转动画效果的实现方法
Sep 23 Javascript
JavaScript时间日期操作实例小结【5个示例】
Dec 22 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
php 启动报错如何解决
2014/01/17 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
一个js实现的所谓的滑动门
2007/05/23 Javascript
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
2020/06/11 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
python实现简单名片管理系统
2018/11/30 Python
ipython和python区别详解
2019/06/26 Python
Python-接口开发入门解析
2019/08/01 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
掌上明珠Java程序员面试总结
2016/02/23 面试题
数控技术专科生自我评价
2014/01/08 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
三年级学生评语大全
2014/12/26 职场文书
关于学习的决心书
2015/02/05 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
简单聊聊Golang中defer预计算参数
2022/03/25 Golang
React四级菜单的实现
2022/04/08 Javascript