深入理解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实现的像java、c#之类的sleep暂停的函数代码
Mar 04 Javascript
简短几句 通俗解释javascript的闭包
Jan 17 Javascript
获取3个数组不重复的值的具体实现
Dec 30 Javascript
jquery操作cookie插件分享
Jan 14 Javascript
JS实现输入框提示文字点击时消失效果
Jul 19 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
Sep 04 Javascript
微信小程序实现移动端滑动分页效果(ajax)
Jun 13 Javascript
Angular 4.X开发实践中的踩坑小结
Jul 04 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
Aug 08 jQuery
vue前端框架—Mint UI详解(更适用于移动端)
Apr 30 Javascript
Vue将页面导出为图片或者PDF
Aug 17 Javascript
详解Nuxt.js中使用Element-UI填坑
Sep 06 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
咖啡语言
2021/03/03 咖啡文化
PHP5中MVC结构学习
2006/10/09 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
php学习笔记 数组遍历实现代码
2011/06/09 PHP
php获取服务器信息的实现代码
2013/02/04 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
一个完整的PHP类包含的七种语法说明
2015/06/04 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
JavaScript 实现的checkbox经典实例分享
2016/10/16 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
浅谈vuex中store的命名空间
2019/11/08 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
[26:40]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第一局
2016/02/25 DOTA
Python实现邮件的批量发送的示例代码
2018/01/23 Python
Python返回数组/List长度的实例
2018/06/23 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
python批量创建指定名称的文件夹
2019/03/21 Python
python plotly绘制直方图实例详解
2019/07/22 Python
使用python实现滑动验证码功能
2019/08/05 Python
Python netmiko模块的使用
2020/02/14 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
秋季运动会广播稿(30篇)
2014/09/13 职场文书
公司员工手册范本
2015/05/14 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
python Tkinter的简单入门教程
2021/04/11 Python