深入理解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版)
Nov 19 Javascript
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
Apr 02 Javascript
DIV菜单层实现代码
Nov 19 Javascript
jquery实现背景墙聚光灯效果示例分享
Mar 02 Javascript
Javascript中的几种URL编码方法比较
Jan 23 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
Apr 23 Javascript
使用jQuery实现页面定时弹出广告效果
Aug 24 jQuery
如何在vue中使用ts的示例代码
Feb 28 Javascript
vue2.0安装style/css loader的方法
Mar 14 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
Aug 16 Javascript
基于Vue SEO的四种方案(小结)
Jul 01 Javascript
微信小程序中target和currentTarget的区别小结
Nov 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
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
Admin generator, filters and I18n
2011/10/06 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
原生js和jquery实现图片轮播特效
2015/04/23 Javascript
JavaScript中的getTime()方法使用详解
2015/06/10 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
jQuery实现评论模块
2020/08/19 jQuery
python 实现网上商城,转账,存取款等功能的信用卡系统
2016/07/15 Python
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
python实现图片九宫格分割
2021/03/07 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
给实习单位的感谢信
2014/02/01 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
护林防火标语
2014/06/27 职场文书
送达通知书
2015/04/25 职场文书
2015年暑假生活总结
2015/07/13 职场文书
《西门豹》教学反思
2016/02/23 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书