深入理解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 相关文章推荐
javascript 写的一个简单的timer
Jul 30 Javascript
jQuery Study Notes学习笔记 (二)
Aug 04 Javascript
javascript tips提示框组件实现代码
Nov 19 Javascript
Json对象与Json字符串互转(4种转换方式)
Mar 27 Javascript
Javascript 实现复制(Copy)动作方法大全
Jun 20 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
Nov 06 Javascript
Jquery日期选择datepicker插件用法实例分析
Jun 08 Javascript
node.js实现爬虫教程
Aug 25 Javascript
JS定时器实现数值从0到10来回变化
Dec 09 Javascript
详解Node.js利用node-git-server快速搭建git服务器
Sep 27 Javascript
jQuery实现点击图标div循环放大缩小功能
Sep 30 jQuery
Element Carousel 走马灯的具体实现
Jul 26 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
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
2016/01/07 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
javascript匀速动画和缓冲动画详解
2016/10/20 Javascript
js仿淘宝评价评分功能
2017/02/28 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
[03:43]TI9战队采访——PSG.LGD
2019/08/22 DOTA
Python学习笔记之os模块使用总结
2014/11/03 Python
Python实现的计算器功能示例
2018/04/26 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
python语言的优势是什么
2020/06/17 Python
python中rb含义理解
2020/06/18 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
国旗下的讲话演讲稿
2014/05/08 职场文书
党建工作经验交流材料
2014/05/25 职场文书
好人好事演讲稿
2014/09/01 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
化妆品促销活动总结
2015/05/07 职场文书
小马王观后感
2015/06/11 职场文书
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python