深入理解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 相关文章推荐
用js怎么把&字符换成"&amp:"
Oct 19 Javascript
页面中body onload 和 window.onload 冲突的问题的解决
Jul 01 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
Feb 18 Javascript
JavaScript实现弹出子窗口并传值给父窗口
Dec 18 Javascript
JavaScript中对象property的删除方法介绍
Dec 30 Javascript
JavaScript模块化开发之SeaJS
Dec 13 Javascript
深入探讨Vue.js组件和组件通信
Sep 12 Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
Dec 19 Javascript
JavaScript中闭包的详解
Apr 01 Javascript
详解Angular 自定义结构指令
Jun 21 Javascript
js+html5实现复制文字按钮
Jul 15 Javascript
使用puppeteer破解极验的滑动验证码
Feb 24 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
基于PHP一些十分严重的缺陷详解
2013/06/03 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
JavaScript对象、属性、事件手册集合方便查询
2010/07/04 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
Node.js编码规范
2014/07/14 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
Python求算数平方根和约数的方法汇总
2016/03/09 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
Python爬虫实现“盗取”微信好友信息的方法分析
2019/09/16 Python
python安装本地whl的实例步骤
2019/10/12 Python
下载官网python并安装的步骤详解
2019/10/12 Python
Python 实现一个简单的web服务器
2021/01/03 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
演讲稿开场白
2014/01/13 职场文书
我爱祖国演讲稿
2014/09/02 职场文书
企业挂职心得体会
2014/09/10 职场文书
小学教师教学反思
2016/02/24 职场文书
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android