我写的程序员面试系列文章
Java面试系列-webapp文件夹和WebContent文件夹的区别?
程序员面试系列:Spring MVC能响应HTTP请求的原因?
Java程序员面试系列-什么是Java Marker Interface(标记接口)
设计模式(Design Pattern)中的桥接模式,有的朋友平时工作可能很少用到。桥接模式的核心在于将抽象部分和它的实现部分分离,使它们都可以独立的变化。听起来很抽象,让我们看一个具体而简单的例子,通过这个例子一步步的完善来加深对桥接模式的理解。
很多论坛点登录按钮时,
周围背景都会暗下来,这样可以突出即将弹出的登录框,让用户把精力集中在用户名和密码的输入上去。
很多论坛对于这种背景变暗的UI实现,是创建了一个HTML原生的div元素,加上一些精心设计过背景颜色的CSS样式来完成的。
我们下面称这种div元素为遮罩层div元素,即mask div。
下面讨论创建mask div的最优解。
实现版本1
创建一个createMask函数,作为登录按钮的事件响应函数。每次点击按钮之后执行该函数。
var createMask = function(){
return document.body.appendChild( document. createElement('div') );
}
$(‘#logon_button').click(function(){
var mask = createMask();
mask.show();
})
版本1的缺点
每次点击按钮都会创建一个mask div。当然一般情况下登录按钮只会点击一次。但是在面试场景中,面试官可能会把这个问题的讨论引导到其他方向上。如何实现即使多次点击按钮,也只会创建一次mask div?于是就有了版本2。
实现版本2
事先创建好一个mask div,放到一个全局变量里保存。这种方式有点像单例模式(singleton)的饿汉式单例。
var mask = document.body.appendChild(document.createElement('div' ) );
$( '#logon_button').click(function(){
mask.show();
})
版本2的缺点
版本2采用了一个全局变量保存事先创建好的mask div。还记得那句话么?全局变量是万恶之源。
另外,假设用户永远不点登录按钮,只是以游客身份浏览网站,那么这个mask div就白白创建了。
实现版本3
var mask;
var createMask = function(){
if(mask)
return mask;
else{
mask = document,body.appendChild( document.createElement('div') );
return mask;
}
}
版本3的缺点
虽然使用了饱汉式单例模式,避免了mask div在没有点击登录按钮的情况下不必要的创建,但还是使用了全局变量来存放mask div。要记住我们现在是在用JavaScript,因此可以用它提供的强大的闭包特性(closure)来实现不需要全局变量的饱汉式单例模式。
实现版本4
var createMask = function() {
var mask;
return function() {
return mask || ( mask = document.body.appendChild(document.createElement('div')));
}
}();
借助JavaScript的闭包特性,我们在第二行创建的自由变量(Free variable)只在闭包内部可见,外部消费者感知不到这个变量,因此成为存储mask div的最佳选择。看起来这个版本已经很完美了?不,它仍然有可以优化的空间,即题目提到的桥接模式。
版本4的缺点
从单一职责原理(Single Responsibility)来衡量版本4,createMask函数里实际包含了两种不同类型的逻辑:
1. 创建mask div
2. 使该mask div “单例化”
我们下面使用桥接模式将这两种逻辑分开,来实现最终版本。
使用桥接模式的实现版本5
这个实现包含了三个JavaScript函数。首先看singleton函数。
函数singleton的输入参数是另一个JavaScript函数(我称其为原始函数),输出是一个包装后的函数,其内部使用闭包,将原始函数第一次执行的结果保存在闭包内,当包装后的函数第二次执行时,直接返回闭包内保存的第一次执行结果。我们可以把singleton函数当成一个构造器,传入任意一个具有返回值的JavaScript函数,负责生产出具有“单例化”特性的新函数。
var singleton = function(fn){
var result;
return function() {
return result || ( result = fn.apply(this,arguments));
}
}
var origin = function(){
return document.body.appendChild(document.createElement('div'));
};
var createMask = singleton(origin);
然后我们调用这个singleton函数,把我们原始的创建mask div的函数origin作为参数传进去,得到加工后的新函数createMask。
相关推荐
深入理解JavaScript系列(44):设计模式之桥接模式 深入理解JavaScript系列(45):代码复用模式(避免篇) 深入理解JavaScript系列(46):代码复用模式(推荐篇) 深入理解JavaScript系列(47):对象创建模式...
桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化。 正文 桥接模式最常用在事件监控上,先看一段代码: 代码如下: addEvent(element, ‘click’, getBeerById); function getBeerById(e) {...
深入理解JavaScript系列(44):设计模式之桥接模式 深入理解JavaScript系列(45):代码复用模式(避免篇) 深入理解JavaScript系列(46):代码复用模式(推荐篇) 深入理解JavaScript系列(47):对象创建模式...
总之,"JavaScript设计模式"这本书是学习和掌握JavaScript设计模式的宝贵资源,无论是初学者还是经验丰富的开发者,都能从中受益匪浅,提升自己的编程技能和项目管理能力。通过阅读和实践书中的内容,你将能够写出...
桥接模式是JavaScript设计模式中的一种重要模式,它将抽象部分与实现部分分离开,使两者可以独立地改变,并且可以一起和谐地工作。这种模式对于JavaScript中的大型项目开发非常有价值。 桥接模式的主要思想是将抽象...
《JavaScript设计模式》共有两部分。第一部分给出了实现具体设计模式所需要的面向对象特性的基础知识...《JavaScript设计模式》适合各层次的Web前端开发人员阅读和参考,也适合有C++/Java/C#背景的服务器端程序员学习。
桥接模式是一种设计模式,主要目的是将抽象部分与其实现部分分离,以便两者可以独立地进行扩展。在JavaScript中,这种模式可以用于处理多个相互独立变化的方面,从而提高代码的灵活性和可维护性。以下是对桥接模式的...
包含javascript的基础语法,面向对象的实现和设计模式实现Javascript 代码其中很多都是伪代码的写法,便有回顾和总结。参考资料包含javascript的基础面向对象的实现设计模式实现语法开javascript常见的问题...
该文档是根据博客园汤姆大叔的深入理解JavaScript系列...44.设计模式之桥接模式 45.代码复用模式(避免篇) 46.代码复用模式(推荐篇) 47.对象创建模式(上篇) 48.对象创建模式(下篇)
设计模式是软件工程中的一种标准解决方案,用于解决在开发过程中经常遇到的问题,它们代表了最佳实践,被广泛应用于各种编程语言中,如Java、C#和JavaScript。GOF 23设计模式,由Erich Gamma、Richard Helm、Ralph ...
桥接模式最常见和实际的应用场合之一是事件监听器回调函数。 example:事件监听器,把事件处理的语句封装到回调函数中,通过接口而不是实现进行编程。 基本理论 桥接模式定义:将抽象部分与它的实现部分分离,使它们...
设计模式是软件工程中的一种...在面试中,展示对设计模式的理解和应用能力,往往能体现出一个程序员的专业素养和技术深度。因此,这份【面试资料】-(机构内训资料)设计模式面试专题是准备面试时不可或缺的学习材料。
桥接模式(Bridge Pattern)作为一种结构型设计模式,尤为擅长于处理和抽象化类的多个维度变化,通过将抽象部分与其实现部分解耦,从而使得两者可以独立地变化和发展。在《17 桥接模式:组装变频洗衣机.pdf》的深入...
设计模式通常分为三大类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式和原型模式)、结构型模式(如代理模式、装饰器模式、适配器模式、桥接模式、组合模式、外观模式和享元模式)和行为型模式(如...
深入学习和理解JavaScript设计模式能帮助开发者编写更可维护、可扩展和易于理解的代码。而通过规格测试,我们可以保证代码的质量,减少错误,并在代码库发生变化时尽早发现潜在问题。在"JavaScriptDesignPatterns-...
设计模式是在特定上下文中解决常见问题的一系列解决方案。在JavaScript开发中,熟练掌握设计模式能够帮助开发者写出更灵活、可维护的代码。以下是一些常见的设计模式及其应用场景: - **单例模式**:确保一个类只有...