深入理解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 相关文章推荐
基于zepto.js简单实现上传图片
Jun 21 Javascript
jQuery实现字体颜色渐变效果的方法
Mar 29 jQuery
jQuery+ajax实现局部刷新的两种方法
Jun 08 jQuery
Vue2.0实现将页面中表格数据导出excel的实例
Aug 09 Javascript
写给vue新手们的vue渲染页面教程
Sep 01 Javascript
python爬取安居客二手房网站数据(实例讲解)
Oct 19 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
Mar 08 Javascript
node.js使用redis储存session的方法
Sep 26 Javascript
webpack@v4升级踩坑(小结)
Oct 08 Javascript
ES6中Symbol、Set和Map用法详解
Aug 20 Javascript
JavaScript文档加载模式以及元素获取
Jul 28 Javascript
JavaScript控制台的更多功能
Apr 28 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写的基于Memcache的Queue实现代码
2011/11/27 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
JS定时器实例详细分析
2013/10/11 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
基于ajax和jsonp的原生封装(实例)
2017/10/16 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
Python的Flask框架中配置多个子域名的方法讲解
2016/06/07 Python
python字典键值对的添加和遍历方法
2016/09/11 Python
详解Python做一个名片管理系统
2019/03/14 Python
python之yield和Generator深入解析
2019/09/18 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
英国综合网上购物商城:The Hut
2018/07/03 全球购物
自荐信如何“自荐”
2013/10/24 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
班级学习计划书
2014/04/27 职场文书
毕业大学生自荐信
2014/06/17 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android