再起航,我的学习笔记之JavaScript设计模式14(桥接模式)
桥接模式
桥接模式(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(桥接模式)的更多相关文章
- 再起航,我的学习笔记之JavaScript设计模式08(建造者模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...
- 再起航,我的学习笔记之JavaScript设计模式09(原型模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...
- 再起航,我的学习笔记之JavaScript设计模式11(外观模式)
经过一段时间的学习与分享,我们对创建型设计模式已经有了一定的认识,未来的一段时间里我们将展开新的篇章,开始迈入结构性设计模式的学习. 结构性设计模式与创建型设计模式不同,结构性设计模式更偏向于关注如何 ...
- 再起航,我的学习笔记之JavaScript设计模式17(模板方法模式)
模板方法模式 由模板方法模式开始我们正式告别结构型设计模式,开始行为型设计模式的学习分享 行为型设计模式用于不同对象之间职责划分或算法抽象,行为型设计模式不仅仅涉及类和对象,还涉及类或对象之间的交流模 ...
- 再起航,我的学习笔记之JavaScript设计模式20(策略模式)
策略模式 策略模式(Strategy):将定义的一组算法封装起来,使其相互之间可以替换.封装的算法具有一定的独立性,不会随客户端变化而变化. 其实策略模式在我们生活中可应用的地方还是比较多的,比如在商 ...
- 再起航,我的学习笔记之JavaScript设计模式22(访问者模式)
访问者模式 概念介绍 访问者模式(Visitor): 针对于对象结构中的元素,定义在不改变该对象的前提下访问结构中元素的新方法 解决低版本IE兼容性 我们来看下面这段代码,这段代码,我们封装了一个绑定 ...
- 再起航,我的学习笔记之JavaScript设计模式24(备忘录模式)
备忘录模式 概念介绍 备忘录模式(Memento): 在不破坏对象的封装性的前提下,在对象之外捕获并保存该对象内部的状态以便日后对象使用或者对象恢复到以前的某个状态. 简易分页 在一般情况下我们需要做 ...
- 再起航,我的学习笔记之JavaScript设计模式25(迭代器模式)
迭代器模式 概念介绍 迭代器模式(Iterator): 在不暴露对象内部结构的同时,可以顺序地访问聚合对象内部的元素. 迭代器 程序中的循环是一种利器,循环语句也使我们程序开发更简洁高效,但是有时一遍 ...
- 再起航,我的学习笔记之JavaScript设计模式26(解释器模式)
解释器模式 概念介绍 解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 获取元素在页面中的路径 我们都知道获取一个 ...
随机推荐
- Azkaban使用简单笔记
官方文档:http://azkaban.github.io/ Azkaban主要的组成:1. 关系型数据库--MySQL2. AzkabanWebServer3. AzkabanExcutorServ ...
- 使用iframe父页面调用子页面和子页面调用父页面的元素与方法
在实际的项目开发中,iframe框架经常使用,主要用于引入其他的页面.下面主要介绍一下使用iframe引入其他页面后,父页面如何调用子页面的方法和元素以及子页面如何调用父页面的方法和元素. 1.父页面 ...
- Java 9 揭秘(13. Collection API 更新)
Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: 在JDK 9之前如何创建了不可变的list,set和map以及使用它们的问题. 如何使用JDK 9中的List接口的of()静态工厂方法创 ...
- xdu_1009: Josephus环的复仇(线段树)
题目链接 题意不难理解,解法具体看代码及注释吧.. #include<bits/stdc++.h> using namespace std; typedef long long LL; ; ...
- (转)linux中项目部署和日志查看
1 查找进程 ps -ef | grep java 查看所有关于java的进程 root 17540 1 0 2009 ? 01:42:27 /usr/java/ ...
- 关于position
一.position 一)语法: 看了那么久的语法,终于到了讲正题的时间了. 二)定位 1.相对定位:相对元素自己在没有定位之前的位置进行位移,元素仍然保留还没有原来的位置. 特性: 1)不脱离文档流 ...
- 通过HtppWebRequest发送图片到服务器并保存
之前写的楼主没有测试,后来发现用起来有点小问题 就修改了一下,现在已经亲测可用 完全没有问题了 下面就开始贴代码了 首先将图片装换成功byte 数组 这个path是图片的路径 例如d:12.png ...
- 灵玖Nlpir Parser智能挖掘汉语精准分词
在中文自然语言处理中,词是最小的能够独立活动的有意义的语言成分.汉语是以字为基本书写单位,词语之间没有明显的区分标记,因此进行中文自然语言处理通常是先将汉语文本中的字符串切分成合理的词语序列,然后再在 ...
- Openresty使用Thrift安装步骤
最新想用Golang与Openresty相互通讯调用,使用RPC协议来实现,后来研究最终选择了Thrift:主要还是FB实现了支持Lua和Go模块,直接编译就可以成功嵌套使用,非常方便:研究了两天最后 ...
- Sublime text 3搭建Python开发环境
前辈们说的已经很多了,但是自己依旧会出现各种问题,写篇日志记录这次的搭建经验. 1.安装python,我用的是python3.5,可以上官网下载 2.安装Sublime text 3,可以上官网下载 ...