16

我目前正在阅读http://addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascript

我将中介者模式理解为某种设置发布和订阅功能的对象。

通常我正在设置已经提供subscribe()方法publish()的对象。具体对象扩展了这个基础对象,因此subscribe()总是publish()注册为原型属性。

据我了解,中介者模式用于将发布订阅方法添加到对象。

这种做法有什么好处?提供具有发布和订阅功能的基础对象不是比在构造时设置中介器更好的做法吗?

还是我对中介模式的理解有误?

4

2 回答 2

20

正如我前段时间从类似帖子中学到的:

  • 中介者模式提供了一个标准的 API 供模块使用。

    让我们举个例子:

    您的应用程序的数千个模块严重依赖 jQuery 的$.post. 如果突然间,您的公司遇到许可问题并决定迁移到例如 MooTools 或 YUI,您会查找所有使用的代码$.post并将其替换为类似的代码MooTools.post吗?

    中介者模式通过规范化 API 解决了这个危机。模块所知道的是,您的中介有一个发布功能,无论使用什么库,它都可以进行 AJAX 发布。

    //module only sees MyMediator.post and only knows that it does an AJAX post
    //How it's implemented and what library is used is not the module's concern
    
    jQuery.post   -> MyMediator.post -> module
    MooTools.post -> MyMediator.post -> module
    YUI.post      -> MyMediator.post -> module
    
  • 中介充当模块间通信的“中间人”。

    新手 JS 开发中的一个问题是模块是相互依赖的。那是什么时候:

    MyClassA.something = MyClassB.method();
    MyClassB.something = MyClassA.method();
    

    但是,如果出现问题MyClassB并且开发人员将其从构建中删除怎么办。您是否会查找并删除该用途中的所有代码MyClassA,以MyClassB使其不会因缺少而中断MyClassB

    中介者模式publishsubscribe模式通过使模块订阅事件而不是直接与其他模块交互来解决这个问题。中介充当事件发布时触发的回调/订阅的集合。

    这种“匿名”订阅导致部分松耦合。模块仍然需要知道要监听哪些模块或至少要监听一组事件,但它们的连接方式不会导致任何一个被取出时损坏。他们所知道的是他们订阅了该事件并将在该事件发生时执行 - 无论是谁触发它,它是否触发,或者触发器是否存在。

于 2012-09-21T16:38:06.770 回答
3

您可以在不使用事件 (pub/sub) 的情况下实现中介。在复杂/复杂的流程中,调试或推理纯事件驱动的代码可能具有挑战性。

有关如何在没有 pub/sub 的情况下创建调解器的示例,您可以查看我的项目 jQueryMediator: https ://github.com/jasonmcaffee/jQueryMediator

于 2013-11-18T19:38:03.693 回答