深入理解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 相关文章推荐
json 定义
Jun 10 Javascript
jQuery在vs2008及js文件中的无智能提示的解决方法
Dec 30 Javascript
dojo随手记 gird组件引用
Feb 24 Javascript
javascript 弹出层组件(升级版)
May 12 Javascript
JS辨别访问浏览器判断是android还是ios系统
Aug 19 Javascript
Java File类的常用方法总结
Mar 18 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
实现隔行换色效果的两种方式【实用】
Nov 27 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
Feb 21 Javascript
vue-cli3.0配置及使用注意事项详解
Sep 05 Javascript
angular组件间传值测试的方法详解
May 07 Javascript
解决vue无法侦听数组及对象属性的变化问题
Jul 17 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
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
PHP实现视频文件上传完整实例
2014/08/28 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
2015/10/08 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
Django返回json数据用法示例
2016/09/18 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
Python实现的文轩网爬虫完整示例
2019/05/16 Python
python如何删除文件中重复的字段
2019/07/16 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
python读取ini配置文件过程示范
2019/12/23 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
生日宴会答谢词
2014/01/09 职场文书
写给女朋友的检讨书
2014/01/28 职场文书
安全目标责任书
2014/07/22 职场文书
SQL SERVER触发器详解
2022/02/24 SQL Server
Java 多线程并发FutureTask
2022/06/28 Java/Android