桥接模式

桥接模式(Bridge):

在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦

从定义上看桥接模式的定义十分难以理解,那么我们来通过示例来演示什么是桥接模式。

现在我们需要做一个导航栏随鼠标移入移出改变颜色的简单特效,但是部分选项卡全部变色,部分选项卡部分变色

html代码如下:

<div style="width: 400px;height: 40px;">
<span style="width: 120px;height: 40px;display: block;border: 1px solid black;float: left;">用户:东城慕水</span>
<span style="width: 80px;height: 40px;display: block;border: 1px solid black;float: left;">天气:<strong>晴</strong></span>
<span style="width: 180px;height: 40px;display: block;border: 1px solid black;float: left;">当前时间:<strong>2017-8-27</strong></span>
</div>

接下我们在js中针对每个选项卡不同的特点分别处理

var spans=document.getElementsByTagName('span');
//绑定用户特效
spans[0].onmouseover=function(){
this.style.color='red';
this.style.background='#ddd';
}
spans[0].onmouseout=function(){
this.style.color='#333';
this.style.background='#f5f5f5';
}
spans[1].onmouseover=function(){
this.getElementsByTagName('strong')[0].style.color='red';
this.getElementsByTagName('strong')[0].style.background='#ddd';
}
spans[1].onmouseout=function(){
this.getElementsByTagName('strong')[0].style.color='#333';
this.getElementsByTagName('strong')[0].style.background='#f5f5f5';
}
spans[2].onmouseover=function(){
this.getElementsByTagName('strong')[0].style.color='red';
this.getElementsByTagName('strong')[0].style.background='#ddd';,
}
spans[2].onmouseout=function(){
this.getElementsByTagName('strong')[0].style.color='#333';
this.getElementsByTagName('strong')[0].style.background='#f5f5f5';
}

我们看到虽然我们实现了功能,但是我们代码有很多相似的地方,显得特别笨重,可读性也不好,这个时候我们需要对相同的逻辑做抽象提取处理。

如果我们用面向对象的思维去编程,我们代码会更简洁,重用率会更大,可读性会更高

我们再来看我们的代码中都处理了该元素的字体颜色和背景颜色,所以我们可以把它提取出来

function changeColor(dom,color,bg){
dom.style.color=color;
dom.style.background=bg;
}

那么接下来我们就要处理元素的绑定事件了,然后我们要把我们的元素绑定事件和抽取的设置样式的方法连接起来,这个连接方法就是桥接方法,这种模式就是桥接模式。

var spans=document.getElementsByTagName('span');
spans[0].onmouseover=function(){
changeColor(this,'red','#ddd');
}
spans[0].onmouseout=function(){
changeColor(this,'#333','#f5f5f5');
}
spans[1].onmouseover=function(){
changeColor(this.getElementsByTagName('strong')[0],'red','#ddd');
}
spans[1].onmouseout=function(){
changeColor(this.getElementsByTagName('strong')[0],'#333','#f5f5f5');
}
spans[2].onmouseover=function(){
changeColor(this.getElementsByTagName('strong')[0],'red','#ddd');
}
spans[2].onmouseout=function(){
changeColor(this.getElementsByTagName('strong')[0],'#333','#f5f5f5');
}

现在看是不是比之前清晰了很多,如果我们想对需求做任何修改只要修改changeColor的内容就可以了。

总结

桥接模式 最主要的特点就是将实现层(比如我们这里用到的元素绑定事件)与抽象层(比如我们这里修改页面颜色的逻辑)解耦分离,使两部分可以独立化。

我们可以看出桥接模式主要是让结构之间产生联系,之前我们介绍的抽象工厂模式与创建者模式主要业务在于创建,而桥接模式主要实现解耦,使实线层与抽象层分开处理,提现了面向对象对扩展的开放及对修改的关闭原则。

当然由于桥接的添加,有时也会造成开发成本的增加。性能上也会受到一定的影响。

也谢谢大家看到这里:)如果你觉得我的分享还可以请点击推荐,分享给你的朋友让我们一起进步~

好了以上就是本次分享的全部内容,本次示例参考自JavaScript设计模式一书,让我们一点点积累一点点成长,希望对大家有所帮助。

欢迎转载,转载请注明作者,原文出处。

再起航,我的学习笔记之JavaScript设计模式14(桥接模式)的更多相关文章

  1. 再起航,我的学习笔记之JavaScript设计模式08(建造者模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...

  2. 再起航,我的学习笔记之JavaScript设计模式09(原型模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...

  3. 再起航,我的学习笔记之JavaScript设计模式11(外观模式)

    经过一段时间的学习与分享,我们对创建型设计模式已经有了一定的认识,未来的一段时间里我们将展开新的篇章,开始迈入结构性设计模式的学习. 结构性设计模式与创建型设计模式不同,结构性设计模式更偏向于关注如何 ...

  4. 再起航,我的学习笔记之JavaScript设计模式17(模板方法模式)

    模板方法模式 由模板方法模式开始我们正式告别结构型设计模式,开始行为型设计模式的学习分享 行为型设计模式用于不同对象之间职责划分或算法抽象,行为型设计模式不仅仅涉及类和对象,还涉及类或对象之间的交流模 ...

  5. 再起航,我的学习笔记之JavaScript设计模式20(策略模式)

    策略模式 策略模式(Strategy):将定义的一组算法封装起来,使其相互之间可以替换.封装的算法具有一定的独立性,不会随客户端变化而变化. 其实策略模式在我们生活中可应用的地方还是比较多的,比如在商 ...

  6. 再起航,我的学习笔记之JavaScript设计模式22(访问者模式)

    访问者模式 概念介绍 访问者模式(Visitor): 针对于对象结构中的元素,定义在不改变该对象的前提下访问结构中元素的新方法 解决低版本IE兼容性 我们来看下面这段代码,这段代码,我们封装了一个绑定 ...

  7. 再起航,我的学习笔记之JavaScript设计模式24(备忘录模式)

    备忘录模式 概念介绍 备忘录模式(Memento): 在不破坏对象的封装性的前提下,在对象之外捕获并保存该对象内部的状态以便日后对象使用或者对象恢复到以前的某个状态. 简易分页 在一般情况下我们需要做 ...

  8. 再起航,我的学习笔记之JavaScript设计模式25(迭代器模式)

    迭代器模式 概念介绍 迭代器模式(Iterator): 在不暴露对象内部结构的同时,可以顺序地访问聚合对象内部的元素. 迭代器 程序中的循环是一种利器,循环语句也使我们程序开发更简洁高效,但是有时一遍 ...

  9. 再起航,我的学习笔记之JavaScript设计模式26(解释器模式)

    解释器模式 概念介绍 解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 获取元素在页面中的路径 我们都知道获取一个 ...

随机推荐

  1. H5读取本地文件操作

    H5读取本地文件操作 本文转自:转:http://hushicai.com/2014/03/29/html5-du-qu-ben-di-wen-jian.html感谢大神分享. 常见的语言比如php. ...

  2. 【Java IO流】File类的使用

    File类的使用 Java中的File类是在java.io.File中,Java.IO.File类表示文件或目录. File类只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. 一 ...

  3. hdu_1907:John(Nim变形)

    题目链接 仍是取石子,不过取到最后一个的败 参考链接:http://www.voidcn.com/blog/liwen_7/article/p-3341825.html 简单一句话就是T2 S0必败 ...

  4. Ajax获取服务器信息

    xhr.onreadystatechange = function(){ if (xhr.readyState == 4){ if ((xhr.status >= 200 && ...

  5. (转)mybatis常用jdbcType数据类型

    1 MyBatis 通过包含的jdbcType类型 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED TINYINT REAL VARCHAR BINARY BLOB ...

  6. AI人工智能-Python实现人机对话

    [前言] AI 在人工智能进展的如火如荼的今天,我们如果不尝试去接触新鲜事物,马上就要被世界淘汰啦~ 本文拟使用Python开发语言实现类似于WIndows平台的“小娜”,或者是IOS下的“Siri” ...

  7. ASP.NET Core 源码学习之 Logging[2]:Configure

    在上一章中,我们对 ASP.NET Logging 系统做了一个整体的介绍,而在本章中则开始从最基本的配置开始,逐步深入到源码当中去. 默认配置 在 ASP.NET Core 2.0 中,对默认配置做 ...

  8. JavaScript addEventListener 第三个参数

    先看一个完整的演示页面代码. Code <!DOCTYPE html> <html lang="zh-CN"> <head> <meta ...

  9. img标签在div中水平垂直居中--两种实现方式

    第一种方式: text-align:center; vertical-align:middle; div{ text-align: center; vertical-align:middle;widt ...

  10. webpack学习--创建一个webpack打包流程

    创建一个webpack打包流程 首先安装webpack插件 mkdir webpack-demo && cd webpack-demo npm init -y npm install ...