详解JavaScript设计模式开发中的桥接模式使用


Posted in Javascript onMay 18, 2016

桥接模式将抽象部分与实现部分分离开来,使两者都可以独立的变化,并且可以一起和谐地工作。抽象部分和实现部分都可以独立的变化而不会互相影响,降低了代码的耦合性,提高了代码的扩展性。
按照GoF的定义,桥接模式的作用在于“将抽象与其实现隔离开来,以便二者独立变化”。这种模式对于Javascript中常见的事件驱动的编程大有裨益。

桥接模式最常见和实际的应用场合之一是事件监听器回调函数。 example:事件监听器,把事件处理的语句封装到回调函数中,通过接口而不是实现进行编程。

基本理论

桥接模式定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
桥接模式主要有4个角色组成:
(1)抽象类
(2)扩充抽象类
(3)实现类接口
(4)具体实现类
根据javascript语言的特点,我们将其简化成2个角色:
(1)扩充抽象类
(2)具体实现类
怎么去理解桥接模式呢?我们接下来举例说明

桥接模式的实现

理解桥接模式的思想,关键是要理解其分离抽象部分和实现部分的思想。我们举例进行说明

最简单的桥接模式

其实我们最经常用的jQuery的each函数就是一个典型的桥接模式,我们模拟其实现如下:

var each = function (arr, fn) {
  for (var i = 0; i < arr.length; i++) {
    var val = arr[i];
    if (fn.call(val, i, val, arr)) {
      return false;
    }
  }
}
var arr = [1, 2, 3, 4];
each(arr, function (i, v) {
  arr[i] = v * 2;
})

在这个例子中,我们通过each函数循环了arr数组,别看这个例子很常见,但其中就包含了典型的桥接模式。
在这个例子中,抽象部分是each函数,也就是上面说的扩充抽象类,实现部分是fn,即具体实现类。抽象部分和实现部分可以独立的进行变化。这个例子虽然简单,但就是一个典型的桥接模式的应用。

插件开发中的桥接模式

桥接模式的一个适用场景是组件开发。我们平时开发组件为了适应不同场合,组件相应的会有许多不同维度的变化。桥接模式就可以应用于此,将其抽象与实现分离,使组件的扩展性更高。
假设我们要开发一个弹窗插件,弹窗有不同的类型:普通消息提醒,错误提醒,每一种提醒的展示方式还都不一样。这是一个典型的多维度变化的场景。首先我们定义两个类:普通消息弹窗和错误消息弹窗。

function MessageDialog(animation) {
  this.animation = animation;
}
MessageDialog.prototype.show = function () {
  this.animation.show();
}
function ErrorDialog(animation) {
  this.animation = animation;
}
ErrorDialog.prototype.show = function () {
  this.animation.show();
}

这两个类就是前面提到的抽象部分,也就是扩充抽象类,它们都包含一个成员animation。
两种弹窗通过show方法进行显示,但是显示的动画效果不同。我们定义两种显示的效果类如下:

function LinerAnimation() {
}
LinerAnimation.prototype.show = function () {
  console.log("it is liner");
}
function EaseAnimation() {
}
EaseAnimation.prototype.show = function () {
  console.log("it is ease");
}

这两个类就是具体实现类,它们实现具体的显示效果。那我们如何调用呢?

var message = new MessageDialog(new LinerAnimation());
message.show();
var error = new ErrorDialog(new EaseAnimation());
error.show();

如果我们要增加一种动画效果,可以再定义一种效果类,传入即可。

总结

学习桥接模式关键是要理解抽象部分与实现部分的分离,使得二者可以独立的变化,而不必拘泥于形式。JS插件灵活的变化,适用场景的多变就非常适合使用这种模式来实现。使用桥接模式最重要的是要找出系统中不同的变化维度。
(1)桥接模式优点:
把抽象与实现隔离开,有助于独立地管理软件的各组成部分。
(2)桥接模式缺点:
每使用一个桥接元素都要增加一次函数调用,这对应用程序的性能会有一些负面影响。提高了系统的复杂程度。如果一个桥接函数被用于连接两个函数,而其中某个函数根本不会在桥接函数之外被调用,那么此时这个桥接函数就不是非要不可的。
桥接模式“将抽象与实现隔离开来,以便二者独立变化”。它可以促进代码的模块化、促成更简洁的实现并提高抽象的灵活性。它可以用来把一组类和函数连接起来,而且提供了一种借助于特权函数访问私用数据的手段。

Javascript 相关文章推荐
JavaScript 计算当天是本年本月的第几周
Mar 22 Javascript
JavaScript中的onerror事件概述及使用
Apr 01 Javascript
javascript设置金额样式转换保留两位小数示例代码
Dec 04 Javascript
百度移动版的url编码解码示例
Apr 29 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
Apr 17 Javascript
jqGrid用法汇总(全经典)
Jun 28 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
Dec 14 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
Jan 16 Javascript
Angularjs 事件指令详细整理
Jul 27 Javascript
JS实现的简单分页功能示例
Aug 23 Javascript
Vue.js原理分析之nextTick实现详解
Sep 07 Javascript
使用JS前端技术实现静态图片局部流动效果
Aug 05 Javascript
jquery解析XML及获取XML节点名称的实现代码
May 18 #Javascript
Jquery跨域获得Json的简单实例
May 18 #Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
May 18 #Javascript
jQuery使用ajax跨域获取数据的简单实例
May 18 #Javascript
JQuery 的跨域方法推荐_可跨任何网站
May 18 #Javascript
深入理解jquery跨域请求方法
May 18 #Javascript
判断是否存在子节点的实现代码
May 18 #Javascript
You might like
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
php自动跳转中英文页面
2008/07/29 PHP
一个php导出oracle库的php代码
2009/04/20 PHP
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
草莓网化妆品澳大利亚站:Strawberrynet AU
2017/12/18 全球购物
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
党的群众路线教育实践活动对照检查材料(个人)
2014/09/24 职场文书
长城导游词400字
2015/01/30 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
合作意向书范本
2019/04/17 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
Python turtle编写简单的球类小游戏
2022/03/31 Python