深入理解JavaScript系列(30):设计模式之外观模式详解


Posted in Javascript onMarch 03, 2015

介绍

外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模块定义了一个高层接口,这个接口值得这一子系统更加容易使用。

正文

外观模式不仅简化类中的接口,而且对接口与调用者也进行了解耦。外观模式经常被认为开发者必备,它可以将一些复杂操作封装起来,并创建一个简单的接口用于调用。

外观模式经常被用于JavaScript类库里,通过它封装一些接口用于兼容多浏览器,外观模式可以让我们间接调用子系统,从而避免因直接访问子系统而产生不必要的错误。

外观模式的优势是易于使用,而且本身也比较轻量级。但也有缺点 外观模式被开发者连续使用时会产生一定的性能问题,因为在每次调用时都要检测功能的可用性。

下面是一段未优化过的代码,我们使用了外观模式通过检测浏览器特性的方式来创建一个跨浏览器的使用方法。

var addMyEvent = function (el, ev, fn) {

    if (el.addEventListener) {

        el.addEventListener(ev, fn, false);

    } else if (el.attachEvent) {

        el.attachEvent('on' + ev, fn);

    } else {

        el['on' + ev] = fn;

    }

};

再来一个简单的例子,说白了就是用一个接口封装其它的接口:
var mobileEvent = {

    // ...

    stop: function (e) {

        e.preventDefault();

        e.stopPropagation();

    }

    // ...

};

总结

那么何时使用外观模式呢?一般来说分三个阶段:

首先,在设计初期,应该要有意识地将不同的两个层分离,比如经典的三层结构,在数据访问层和业务逻辑层、业务逻辑层和表示层之间建立外观Facade。

其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少他们之间的依赖。

第三,在维护一个遗留的大型系统时,可能这个系统已经很难维护了,这时候使用外观Facade也是非常合适的,为系系统开发一个外观Facade类,为设计粗糙和高度复杂的遗留代码提供比较清晰的接口,让新系统和Facade对象交互,Facade与遗留代码交互所有的复杂工作。

参考:大话设计模式

Javascript 相关文章推荐
Jquery中对数组的操作代码
Aug 12 Javascript
js中文逗号转英文实现
Feb 11 Javascript
jQuery中:nth-child选择器用法实例
Dec 31 Javascript
让JavaScript中setTimeout支持链式操作的方法
Jun 19 Javascript
jquery中object对象循环遍历的方法
Dec 18 Javascript
jquery实现可旋转可拖拽的文字效果代码
Jan 27 Javascript
Vue filters过滤器的使用方法
Jul 14 Javascript
js设置随机切换背景图片的简单实例
Nov 12 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
Mar 08 Javascript
微信小程序实现收藏与取消收藏切换图片功能
Aug 03 Javascript
用npm-run实现自动化任务的方法示例
Jan 14 Javascript
手把手教你从零开始react+antd搭建项目
Jun 03 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
Mar 03 #Javascript
jQuery对象与DOM对象之间的相互转换
Mar 03 #Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
Mar 03 #Javascript
JS运动基础框架实例分析
Mar 03 #Javascript
jQuery DOM插入节点操作指南
Mar 03 #Javascript
JS运动框架之分享侧边栏动画实例
Mar 03 #Javascript
jQuery DOM删除节点操作指南
Mar 03 #Javascript
You might like
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
php session 写入数据库
2016/02/13 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
JavaScript必知必会(七)js对象继承
2016/06/08 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
2016/10/31 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
React实现点击删除列表中对应项
2017/01/10 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
Python读写Excel文件的实例
2013/11/01 Python
解析Python中while true的使用
2015/10/13 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
python实现微信自动回复机器人功能
2019/07/11 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
浅析Python迭代器的高级用法
2020/07/16 Python
html5与css3小应用
2013/04/03 HTML / CSS
高一数学教学反思
2014/02/07 职场文书
亲子拓展活动方案
2014/02/20 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs