再起航,我的学习笔记之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):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 获取元素在页面中的路径 我们都知道获取一个 ...
 
随机推荐
- 使用TinyXML进行XML操作
			
本例基于TinyXML实现XML的自动解析和创建,由于本人是菜鸟刚入门,例子中添加了enum.struct.vector.map.list的常见用法,首先添加6个tinyxml工程文件,然后设置调试参 ...
 - ES6关于Unicode的相关扩展
			
前面的话 字符串是编程中重要的数据类型,只有熟练掌握字符串操作才能更高效地开发程序.JS中的字符串String类型是由引号括起来的一组由16位Unicode字符组成的字符序列.在过去,16位足以包含任 ...
 - Serv-U权限设置规则
			
Serv-U有服务器--域--组--用户四级账号管理规则,每一级都有相应的根目录,目录访问规则和虚拟路径的设置. 同样其他一些重复设置还有很多,如此很容易给人造成混乱--如果我哪里都设置的话会不会造成 ...
 - 【AngularJS】学习资料
			
1. http://www.cnblogs.com/lcllao/tag/AngularJs/ http://www.ituring.com.cn/article/13474 http://www.a ...
 - python注释中文
			
原因: 如果文件里有非ASCII字符,需要在第一行或第二行指定编码声明. 解决办法: 必须是在第一行或是第二行加入 1)加上# -*- coding:utf-8 -*-之后就能成功使用中文注释了 2) ...
 - PHP将数据导出Excel表中(投机型)
			
1.简介 如何利用最简单粗糙暴力的方法将数据写入Excel文件中呢? 因为ms word和excel的文档都支持html文本格式,因此我们可以基于这个原理采用html文本格式进行数据的输出. 在htm ...
 - (MVC)javaBaen+jsp+servlet对数据的操作
			
运用MVC对数据进行一些简单的处理,基本实现数据的增删改查,达到前端和后台的数据之间的交互. 1.开始界面 <%@page import="com.zdsofe.work.Studen ...
 - asm添加删除磁盘
			
一. ASM_POWER_LIMIT 参数 这个参数 ASM_POWER_LIMIT 参数控制 ASM 后台进程 ARBx 的数量.ARBx 进程用来进行 ASM 磁盘数据重新分布打散.ASM_POW ...
 - 表达式求值(栈方法/C++语言描述)(三)
			
代码清单 // calculator.h #ifndef CALCULATOR_H #define CALCULATOR_H #include <stack> #include <s ...
 - react学习01
			
react react render()函数返回只能是一个标签(里面可以包其他东西) state(状态) vs props(属性) state 改变,视图改变,state是一个组件里面的状态,然后pr ...