首页 文章 精选 留言 我的

精选列表

搜索[按需加载],共10000篇文章
优秀的个人博客,低调大师

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

我写的程序员面试系列文章 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Java Marker Interface(标记接口) 使用JDK自带的工具jstack找出造成运行程序死锁的原因 编程面试题:编写一个会造成数据库死锁的应用 设计模式(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)的设计理念。 要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

优秀的个人博客,低调大师

Android 显示 WebView ,加载URL 时,向webview的 header 里面传递参数

1、主要布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context=".MainActivity"> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"> </WebView> </RelativeLayout> 2、代码实现 1 package com.webview.demo; 2 3 import android.os.Bundle; 4 import android.support.v7.app.AppCompatActivity; 5 import android.webkit.WebView; 6 7 import java.util.HashMap; 8 import java.util.Map; 9 10 public class MainActivity extends AppCompatActivity { 11 12 private WebView webView ; 13 14 private String webViewHeaderKey = "tokenId" ; 15 private String webViewHeaderValue = "562142" ; 16 17 private String url = "" ; 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 24 webView = (WebView) findViewById( R.id.webview ); 25 26 27 if ( webViewHeaderValue != "" ){ 28 Map<String, String > map = new HashMap<String, String>() ; 29 map.put( webViewHeaderKey , webViewHeaderValue ) ; 30 31 webView.loadUrl( url , map ) ; 32 }else { 33 webView.loadUrl( url ) ; 34 } 35 36 } 37 }

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册