jQuery 库中使用的设计模式

Posted

技术标签:

【中文标题】jQuery 库中使用的设计模式【英文标题】:Design Patterns used in the jQuery library 【发布时间】:2011-04-07 13:25:07 【问题描述】:

jQuery 高度关注 DOM,并围绕它提供了一个很好的抽象。在这样做时,它利用了昨天刚刚击中我的各种知名design patterns。一个明显的例子是Decorator 模式。 jQuery 对象围绕常规 DOM 对象提供了新的和附加的功能。

例如,DOM 有一个原生的insertBefore 方法,但没有对应的 insertAfter 方法。有多种实现available 可以填补这一空白,而 jQuery 就是提供此功能的此类库之一:

$(selector).after(..)
$(selector).insertAfter(..)

在 jQuery 中大量使用装饰器模式的例子还有很多。

您还注意到图书馆本身包含哪些其他设计模式示例,无论大小?另外,请提供该模式的使用示例。

将其设为社区 wiki,因为我相信人们对 jQuery 的喜爱可以追溯到众所周知的设计模式,只是它们通常不被模式名称所指。这个问题没有一个答案,但对这些模式进行分类将有助于深入了解图书馆本身。

【问题讨论】:

【参考方案1】:

Lazy Initialization:

$(document).ready(function()
    $('div.app').myPlugin();
);

Adapter or wrapper

$('div').css(
    opacity: .1 // opacity in modern browsers, filter in IE.
);

Facade

// higher level interfaces (facades) for $.ajax();
$.getJSON();
$.get();
$.getScript();
$.post();

Observer

// jQuery utilizes it's own event system implementation on top of DOM events.
$('div').click(function())
$('div').trigger('click', function())

Iterator

$.each(function());
$('div').each(function());

Strategy

$('div').toggle(function(), function());

Proxy

$.proxy(function(), obj); // =oP

Builder

$('<div class="hello">world</div>');

Prototype

// this feels like cheating...
$.fn.plugin = function()
$('div').plugin();

Flyweight

// CONFIG is shared
$.fn.plugin = function(CONFIG)
     CONFIG = $.extend(
         content: 'Hello world!'
     , CONFIG);
     this.html(CONFIG.content);

【讨论】:

那里做得很好 :) .. 我认为 $.ajax 的 Facade 模式类似于 Template method 模式,因为我们具有基本功能,并且每个附加方法(例如 $.get)都会覆盖基本并生成它更具体。 是的,很多 jQuery 方法,实际上 javascript 通常可以同时遵守无数的设计模式。它是一般 JavaScript 表达能力以及函数式编程如何补充面向对象编程的一个典型例子。 =)【参考方案2】:

Composite 模式在 jQuery 中也很常用。与其他库一起工作后,我可以看到这种模式并不像第一眼看上去那么明显。该模式基本上是这样说的,

一组对象的处理方式与一个对象的单个实例相同。

例如,在处理单个 DOM 元素或一组 DOM 元素时,可以统一处理。

$('#someDiv').addClass('green'); // a single DOM element

$('div').addClass('green');      // a collection of DOM elements

【讨论】:

【参考方案3】:

Singleton/Module 模式怎么样,正如这篇关于 YUI 的文章中所讨论的那样:http://yuiblog.com/blog/2007/06/12/module-pattern/

我相信 jQuery 在其核心中使用了这种模式,并鼓励插件开发人员使用这种模式。使用这种模式是保持全局命名空间整洁的一种方便且有效的方式,它有助于开发人员编写干净的封装代码。

【讨论】:

jQuery 确实在其核心的各个地方都使用了模块模式,并且还向插件开发人员推荐了它,而不是琐碎的插件。很棒的发现:)【参考方案4】:

在函数式编程的眼中,jQuery 是一个 Monad。 Monad 是一种将对象传递给动作、返回修改后的对象并将其传递给下一个动作的结构。就像流水线一样。

Wikipedia article 很好地涵盖了定义。

【讨论】:

我觉得这里的monad是指库的链接能力! 这正是我在这里所描述的。

以上是关于jQuery 库中使用的设计模式的主要内容,如果未能解决你的问题,请参考以下文章

Javascript设计模式

如何在新的 android 设计库中使用 TextInputLayout

使用 Android 设计支持库中的浮动操作按钮的浮动操作菜单实现 [关闭]

如何在 UWP 类库中使用 XAML 静态资源和设计时数据

访问存储库中的 UnitOfWork 是不好的设计吗?

Ajax_jquery库中Ajax方法的使用