以jq为案例看套餐服务---外观模式

栏目: 后端 · 发布时间: 6年前

内容简介:套餐服务--外观模式,属于大类结构型设计模式的一种,通常是为一组复杂的子系统接口提供一个更高级的统一接口,通过这个接口让使用者对子系统的接口更加容易访问。在js中有时也会对底层结构兼容性做统一的封装来简化用户的使用。备注:本文的案例以es5为主,部分会涉及jq的代码,大家理解思想就好。如果你有es6以及目前三大框架的实例应用案例,欢迎分享。

套餐服务--外观模式,属于大类结构型 设计模式 的一种,通常是为一组复杂的子系统接口提供一个更高级的统一接口,通过这个接口让使用者对子系统的接口更加容易访问。

在js中有时也会对底层结构兼容性做统一的封装来简化用户的使用。

备注:本文的案例以es5为主,部分会涉及jq的代码,大家理解思想就好。如果你有es6以及目前三大框架的实例应用案例,欢迎分享。

生活场景延伸

相信大家都经常下饭馆或者点外卖,一般情况下每个店面都会有自己的推荐套餐,这个套餐里配置了菜、汤、米饭等,在点了套餐时就不需要关注这个套餐下每个类的名字叫什么。

饭店的这种将几个不同品种的需求搭配在一起捆绑给顾客的方式就是套餐模式,和我们的外观模式是有共通之处的。

从点击事件说起----兼容方式&&底层向上封装

相信古老的 程序员 都用过jq,还有jq的click事件,一般的写法是这样的对吧。

$(target).on(eventType,fn)
复制代码

也相信大家都用过或者多少知道一点js的原生语法,绑定事件是如何写的。

let dom  = document.querySelector(target)
dom.addEventListener(type,fn,false)
复制代码

发生jq的写法很亲民,很简洁有没有,把使用变的更加简洁了,另外一家是大家可能不知道的,其实addEventListener 并不是一个兼容的写法,其应该的兼容写法是这样的:

if(dom.addEventListener){
dom.addEventListener(type,fn,false)
} else if(dom.attachEvent) {
dom.attachEvent('on'+type,fn)
} else {
dom['on'+type] = fn 
}
复制代码

是这样的么?我们找到jq的事件源码看一下吧 :源码文件位置(要到比较老的1.x的版本才会找到这部分针对事件写的兼容代码哦): github.com/jquery/jque…

// event.add 方法中,183行开始
// Init the event handler queue if we're the first
if ( !( handlers = events[ type ] ) ) {
	handlers = events[ type ] = [];
	handlers.delegateCount = 0;
	// Only use addEventListener/attachEvent if the special events handler returns false
if ( !special.setup ||
					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {

// Bind the global event handler to the element
//use different ways to add event according to different support situation (Robin 批注)
					if ( elem.addEventListener ) {
						elem.addEventListener( type, eventHandle, false );

					} else if ( elem.attachEvent ) {
						elem.attachEvent( "on" + type, eventHandle );
					}
				}
			}
复制代码

结论:从上面可以看出一个简单的添加事件就用了外观模式,而实际上add事件本身在jq看来也是属于封装的底层,其通过再一次封装,将其封装到了on方法中。在整个jq的框架中,在兼容写法上、向上封装上不断地运用了外观模式来设计。

function on( elem, types, selector, data, fn, one ) {
//省略若干代码
return elem.each( function() {
		jQuery.event.add( this, types, fn, data, selector );
	} );
}
复制代码

小型代码库

还是以刚才的jq库为例子,在完成on方法定义的时候,我们看到了一系列的套餐服务的设计暴露出来。每一个看似简单的服务或者套餐或者语法都是一个外观模式的最佳实践。

jQuery.fn.extend( {

	on: function( types, selector, data, fn ) {
		return on( this, types, selector, data, fn );
	},
	one: function( types, selector, data, fn ) {
		return on( this, types, selector, data, fn, 1 );
	},
...
})
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

逆向工程权威指南

逆向工程权威指南

Dennis Yurichev(丹尼斯) / 安天安全研究与应急处理中心 / 人民邮电出版社 / 2017-3-1 / 168

逆向工程是一种分析目标系统的过程,旨在于识别系统的各组件以及组件间关系,以便于通过其它形式、或在较高的抽象层次上,重建系统的表征。 本书专注于软件的逆向工程,是写给初学者的一本经典指南。全书共分为12个部分,共102章,涉及X86/X64、ARM/ARM-64、MIPS、Java/JVM等重要话题,详细解析了Oracle RDBMS、Itanium、软件狗、LD_PRELOAD、栈溢出、EL......一起来看看 《逆向工程权威指南》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具