Module pattern 是一种常用的设计模式,它用closures来封装public/private的变量和方法,所有复杂的业务逻辑都留在closure空间里,只暴露public API到全局,并且避免命名空间混乱。 不过在Java里,并没有任何保留字可以将变量设置成私有的,我们只是利用closure来模拟privacy的概念,让外界无法访问到它,所有私有的变量和方法只能在closure空间内被访问,而被函数返回的变量和方法才能被外部访问。 下面有个购物车的例子,这个模块在全局里叫basketModule,模块里的basket array是私有的,只能通过public api访问到它,例如:addItem(),getItem()。
这个模块返回一个组件,并且赋值给basketModule,所以可以想下面访问它:
从历史回顾下,module pattern原本是在2003年由几个人发展出来的,其中包括Richard Cornford,之後再由 Douglas Crockford 和 Eric Miraglia 发扬光大。 我们来看看 module pattern 在特定的框架下是如何应用的。 Dojo Dojo通过dojo.declare提供一种近似类(class)的概念来达到module pattern的,例如我们想在命名空间store下新建一个模块basket:
YUI 这个例子是用来YUI来实现module pattern。
jQuery
相关资料 Rebecca Murphey — Structuring Java Applications Peter Michaux — MVC Architecture For Java Applications StackOverflow — A discussion on modern MVC frameworks Doug Neiner — Stateful Plugins and the Widget Factory Object Literan Notation 在对象字面量里,将一连串用逗号隔开的name/value组合放到大括号里({}),name 和 value 又以分号隔开,这样就完成了组件的封装,你可以看看下方的案例。 如果模块沒有任何的私有属性或方法,很合适使用对象字面量。
相关资料 Rebecca Murphey — Using Objects To Organize Your Code Stoyan Stefanov — 3 Ways To Define A Java Class Ben Alman — Clarifications On Object Literals (There’s no such thing as a JSON Object) John Resig — Simple Java Inheritance CommonJS Modules 在过去的一两年,我们常常听到 CommonJS,它主要是一个工作团队设计,制作原型和标准化的Java api。目前他们提出CommonJS AMD用来规范模块的设计,这个设计很简洁,我认为它会成为ES6模块组件标准的基础。 一个CommonJS模块就是一个可重用的Java代码,它只是暴露组件给外部访问。有很多很好的教程来教你如何实现CommonJS模块,简单来说模块基本上包含两个东西: 一个exports对象,其附加暴露对象 一个require函数,其用来加载其他模块
有一些不错的模块加载工具,其中我个人推荐RequireJS,而且这有一篇相关的好文。RequireJS让我们可以很简单的创建模块,并且容易使用非同步方式来加载模块。 因为上面的例子无法在浏览器中运行,为了能让它也可以在浏览器中执行,我们再举一个简单的例子,我们要把图片转码成ASCII。
这段代码无法创建一个模块scope,而且require会是undefined,exports对象必须创建,但如果使用XHR加载然后eval()它,就没有问题了。RequireJS都帮我们做好了,只要这样做:
相关资料 The CommonJS Module Specifications Alex Young — Demystifying CommonJS Modules Notes on CommonJS modules with RequireJS The Facade Pattern (责任编辑:本港台直播) |