深入理解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的并行运算实现代码
Nov 19 Javascript
javascript事件委托的方式绑定详解
Jun 10 Javascript
js实现向右横向滑出的二级菜单效果
Aug 27 Javascript
javascript实现别踩白块儿小游戏程序
Nov 22 Javascript
使用BootStrapValidator完成前端输入验证
Sep 28 Javascript
常用jQuery选择器汇总
Feb 02 Javascript
js实现按座位号抽奖
Apr 05 Javascript
Vue $mount实战之实现消息弹窗组件
Apr 22 Javascript
vue下载excel的实现代码后台用post方法
May 10 Javascript
vue源码nextTick使用及原理解析
Aug 13 Javascript
解决VUE双向绑定失效的问题
Oct 29 Javascript
vue-router路由懒加载及实现的3种方式
Feb 28 Vue.js
深入理解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调试函数和日志记录函数分享
2015/01/31 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
javascript 面向对象思想 附源码
2009/07/07 Javascript
javascript 自定义事件初探
2009/08/21 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
matplotlib 纵坐标轴显示数据值的实例
2018/05/25 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
Django 开发环境配置过程详解
2019/07/18 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
雪山饭庄的创业计划书范文
2014/01/18 职场文书
商超业务员岗位职责
2014/03/12 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
职务任命书范本
2014/06/05 职场文书
2014个人年终工作总结范文
2014/12/15 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
赞美教师的句子
2019/09/02 职场文书
MySQL创建管理RANGE分区
2022/04/13 MySQL
Python采集壁纸并实现炫轮播
2022/04/30 Python