Java面试系列-webapp文件夹和WebContent文件夹的区别?javascript
程序员面试系列:Spring MVC能响应HTTP请求的缘由?java
Java程序员面试系列-什么是Java Marker Interface(标记接口)程序员
使用JDK自带的工具jstack找出形成运行程序死锁的缘由web
设计模式(Design Pattern)中的桥接模式,有的朋友平时工做可能不多用到。桥接模式的核心在于将抽象部分和它的实现部分分离,使它们均可以独立的变化。听起来很抽象,让咱们看一个具体而简单的例子,经过这个例子一步步的完善来加深对桥接模式的理解。数据库
不少论坛点登陆按钮时,编程
周围背景都会暗下来,这样能够突出即将弹出的登陆框,让用户把精力集中在用户名和密码的输入上去。设计模式
不少论坛对于这种背景变暗的UI实现,是建立了一个HTML原生的div元素,加上一些精心设计过背景颜色的CSS样式来完成的。闭包
咱们下面称这种div元素为遮罩层div元素,即mask div。app
下面讨论建立mask div的最优解。
建立一个createMask函数,做为登陆按钮的事件响应函数。每次点击按钮以后执行该函数。
var createMask = function(){ return document.body.appendChild( document. createElement('div') ); } $(‘#logon_button').click(function(){ var mask = createMask(); mask.show(); })
每次点击按钮都会建立一个mask div。固然通常状况下登陆按钮只会点击一次。可是在面试场景中,面试官可能会把这个问题的讨论引导到其余方向上。如何实现即便屡次点击按钮,也只会建立一次mask div?因而就有了版本2。
事先建立好一个mask div,放到一个全局变量里保存。这种方式有点像单例模式(singleton)的饿汉式单例。
var mask = document.body.appendChild(document.createElement('div' ) ); $( '#logon_button').click(function(){ mask.show(); })
版本2采用了一个全局变量保存事先建立好的mask div。还记得那句话么?全局变量是万恶之源。
另外,假设用户永远不点登陆按钮,只是以游客身份浏览网站,那么这个mask div就白白建立了。
var mask; var createMask = function(){ if(mask) return mask; else{ mask = document,body.appendChild( document.createElement('div') ); return mask; } }
虽然使用了饱汉式单例模式,避免了mask div在没有点击登陆按钮的状况下没必要要的建立,但仍是使用了全局变量来存放mask div。要记住咱们如今是在用JavaScript,所以能够用它提供的强大的闭包特性(closure)来实现不须要全局变量的饱汉式单例模式。
var createMask = function() { var mask; return function() { return mask || ( mask = document.body.appendChild(document.createElement('div'))); } }();
借助JavaScript的闭包特性,咱们在第二行建立的自由变量(Free variable)只在闭包内部可见,外部消费者感知不到这个变量,所以成为存储mask div的最佳选择。看起来这个版本已经很完美了?不,它仍然有能够优化的空间,即题目提到的桥接模式。
从单一职责原理(Single Responsibility)来衡量版本4,createMask函数里实际包含了两种不一样类型的逻辑:
1. 建立mask div
2. 使该mask div “单例化”
咱们下面使用桥接模式将这两种逻辑分开,来实现最终版本。
这个实现包含了三个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。
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码: