大型JavaScript应用程序架构设计模式(6)

各模块包含了程序里各种各样的功能,他们有信息需要处理的时候,发布信息通知程序(这是他们的主要职责),下面的QA小节里提到了,模块可以依赖一些DOM工具操作方法,但是不应该和系统的其它模块有依赖,一个模块不应该关注如下内容:

1.哪个对象或者模块订阅了这个模块发布的信息
    2.这些对象是客户端对象还是服务器端对象
    3.多少对象订阅了你的信息

/uploads/allimg/200610/0411422506_0.gif

Facade抽象应用程序的核心,避免各个模块之间直接通信,它从各模块上订阅信息,也负责授权检测,确保每个模块有用自己单独的授权。

https://img.jbzj.com/file_images/article/201606/201606291113243.gif

Mediator(应用程序核心)使用mediator模式扮演发布/订阅管理器的角色,负责模块管理以及启动/停止模块执行,可以动态加载以及重启有错误的模块。

/uploads/allimg/200610/04114221V_0.gif

这个架构的结果是:各模块之间没有依赖,因为松耦合的应用,它们可以很容易地被测试和维护,各模块可以很容易地在其它项目里被重用,也可以在不影响程序的情况下动态添加和删除。

发布Pub/订阅Sub的延伸:自动注册事件(Automatic Event Registration)

关于自动注册事件,需要遵守一定的命名规范,比如如果一个模块发布了一个名字为messageUpdate的事件,那么所有带有messageUpdate方法的模块都会被自动执行。有好处也有利弊,具体实现方式,可以看我另外一篇帖子:jQuery自定义绑定的魔法升级版。

QA
1.有可能不使用facade或者类似的sandbox模式么?

尽管架构的大纲里提出了facade可以实现授权检查的功能,其实完全可能由mediator去做,轻型架构要做的事情其实是几乎一样的,那就是解耦,确保各模块直接和应用程序核心通信是没问题的就行。

2.你提高了模块直接不能有依赖,是否意味着不能依赖任何第三方类库(例如jQuery)。

这其实就是一个两面性的问题,我们上面说到了,一个模块也许有一些子模块,或者基础模块,比如基本的DOM操作工具类等,在这个层面上讲,我们是可以用第三方类库的,但是请确保,我们可以很容易地能否替换掉他们。

3.我喜欢这个架构,并且想开始使用这个架构,有任何代码样本可以参考么?

我打算去搞一份代码样本供大家参考,不过在这之前,你可以参考Andrew Burgees的帖子Writing Modular JavaScript 。

4.如果模块需要和应用程序核心直接通信,是否可行?

技术上来将,没有理由现在模块不能和应用程序核心直接通信,但是对于大多数应用体验来说,还是不要。既然你选择了这个架构,那就要遵守该架构所定义的规则。

致谢

感谢Nicholas Zakas的原始贴,将思想总结在一起,感谢Andree Hansson的technical review,感谢Rebecca Murphey, Justin Meyer, John Hann, Peter Michaux, Paul Irish和Alex Sexton,他们所有的人都提供了和本Session相关的很多资料。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzsgpx.html