我写的程序员面试系列文章

Java面试系列-webapp文件夹和WebContent文件夹的区别?

程序员面试系列:Spring MVC能响应HTTP请求的原因?

Java程序员面试系列-什么是Java Marker Interface(标记接口)

使用JDK自带的工具jstack找出造成运行程序死锁的原因

编程面试题:编写一个会造成数据库死锁的应用

设计模式之桥接模式和懒加载" style="">

class="pgc-img-caption" style="">?

设计模式(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。

?

这个例子体现了桥接模式的作用。我们通过singleton这个单例化构造器函数,成功将业务逻辑(创建mask div)和单例化这个纯技术需求分离开,这样也满足了单一职责(single responsibility)的设计理念。

java 懒加载模式_JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载相关推荐

  1. JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载

    2019独角兽企业重金招聘Python工程师标准>>> 我写的程序员面试系列文章 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Sprin ...

  2. 设计模式之桥接模式详解

    设计模式之桥接模式详解 文章目录 设计模式之桥接模式详解 一.什么是桥接模式 二.桥接模式的应用场景 三.桥接模式的角色组成 四.桥接模式通用写法示例 五.桥接模式优缺点 一.什么是桥接模式 桥接模式 ...

  3. java 设计模式之桥接模式,策略模式

    java 设计模式之桥接模式,策略模式 1.引出设计模式 相信大家都玩过王者荣耀这款游戏.我们知道现在大概有九十多个英雄且各自技能及背景故事.台词.被动都不一样而且还带着召唤师技能比如实现,惩戒,弱化 ...

  4. java桥接和装饰_设计模式:桥接模式和装饰模式

    原标题:设计模式:桥接模式和装饰模式 一.桥接模式简介 1.基础描述 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是&qu ...

  5. 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  6. C#设计模式之桥接模式

    桥接模式 文章目录 桥接模式 模式分类 模式产生的原因 模式灵感的来源 模式类图 代码实现 桥接模式和适配器模式的联用 桥接模式的总结 桥接模式的优点: 桥接模式的缺点: 本片博客将介绍桥接模式,桥接 ...

  7. 10.设计模式之桥接模式

    前言 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引 ...

  8. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  9. C++设计模式之桥接模式

    这篇文章主要介绍了C++设计模式之桥接模式,本文讲解了什么是桥接模式.为什么要使用桥接模式.什么时候使用桥接模式等内容,需要的朋友可以参考下 问题描述 现在要去画一个图形,图形有长方形.圆形和扇形等等 ...

最新文章

  1. C++ Exercises(十八)
  2. 设计模式 — 行为型模式 — 访问者模式
  3. java nio doug_Java NIO简介
  4. faster rcnn第二阶段loss出现nan_利用Faster_Rcnn训练模型时出现的问题
  5. C#中的浅拷贝和深拷贝
  6. 今年怪事特别多 时代盘点09十大奇闻
  7. 异常 try catch finally return 执行关系 MD
  8. 【渝粤题库】国家开放大学2021春3935理工英语2题目
  9. 不使用输入框如何实现下拉_如何利用Axure实现下拉子菜单?
  10. Oracle分组取前n条记录
  11. [科技部与你共成长] 几道语言题
  12. java 16进制与汉字_Java汉字与16进制数相互转换
  13. Java图书管理系统(控制台程序)
  14. 一元线性回归Python实现
  15. 内插函数恢复模拟信号
  16. 使用MediaRecorder录制音频
  17. 全链路UI设计师了解一下
  18. 为什么我朋友的移动手机打不开我的网站却能打开www.ip138.com?
  19. opencv学习系列:实例练习(含多个实例)
  20. 机器学习中几种常见的乘积(product)

热门文章

  1. 客户端的效果 ktv 1216
  2. flask-稿件-环境依赖包的生成与安装-flask虚拟环境的布局
  3. linux-实时查看mysql中的日志文件
  4. django-模态框添加学生
  5. 基于Python的ModbusTCP客户端实现
  6. php 执行exec() 操作linux 命令
  7. Nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分...
  8. 用python做测试实现高性能测试工具(4)—系统架构
  9. jquery源码抽丝剥茧--把jquery最小化
  10. 在两个ASP.NET页面之间传递变量【转】