深入理解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中parseInt()函数的定义和用法分析
Dec 20 Javascript
jQuery Validate表单验证入门学习
Dec 18 Javascript
使用vue.js开发时一些注意事项
Apr 27 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
Jan 29 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
Feb 08 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
Oct 30 Javascript
详解Vue.js中引入图片路径的几种方式
Jun 17 Javascript
vue实现记事本功能
Jun 26 Javascript
JavaScript实现身份证验证代码实例
Aug 26 Javascript
Vue按时间段查询数据组件使用详解
Aug 21 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
Sep 18 Javascript
解决vue scoped html样式无效的问题
Oct 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 错误之引号中使用变量
2009/05/04 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
小程序实现多选框功能
2018/10/30 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
Python urllib模块urlopen()与urlretrieve()详解
2013/11/01 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
python绘制随机网络图形示例
2019/11/21 Python
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
自荐信怎么写好
2013/11/11 职场文书
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
爱情保证书范文
2014/02/01 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
医院合作协议书
2014/08/19 职场文书
教师考核鉴定意见
2015/06/05 职场文书
四大名著读书笔记
2015/06/25 职场文书
总结会主持词
2015/07/02 职场文书
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android