【问题标题】:Decoupling backbone with pub/sub将主干与 pub/sub 解耦
【发布时间】:2013-04-12 21:57:12
【问题描述】:

我正在改进我使用骨干网/require 的方式,我发现让模块耦合的做法有多糟糕(我当时不了解解耦)。

我开始使用MinPubSub 并了解大部分情况,但是根据我的阅读,其他模块不应该订阅其他模块(这使它耦合?)。相反,他们应该是所有模块之间的中介,告诉他们如何交互。

我假设这个中介者订阅了所有模块并且所有模块都订阅了中介者?

我不知道如何实现这一点,但还没有找到一个可靠的代码示例来说明如何使用骨干实现这一点,任何关于将 pubsub 添加到骨干的帮助将不胜感激。

很抱歉,这是一个笼统的问题,我试图围绕这个概念展开思考,并找到一个广泛使用的体面示例。

【问题讨论】:

    标签: javascript backbone.js requirejs publish-subscribe


    【解决方案1】:

    咳咳。 pubsub 方法中介模式的实现。您的中介是您的 pubsub 处理程序。

    让我澄清一下。在您的 pubsub 模型中,您注册一个频道并发布到它。那里的任何可能正在侦听的内容都将按照他们订阅的顺序获得您发布的任何内容。

    将此与中介者模式的正式定义进行对比:

    使用中介者模式,对象之间的通信被封装在中介者对象中。对象不再直接相互通信,而是通过中介进行通信。这减少了通信对象之间的依赖关系,从而降低了耦合度。

    (直接来自your favourite encyclopedia

    这对您意味着什么?只要你不做我认识的人曾经做过的事,你就没事。 绝对是您要避免的:

    1. 模块使用自己的名称注册通道
    2. 其他模块通过在其频道上发布以字面名称引用它

    这是事件发布/订阅模型崩溃的地方,因为它在理论上是解耦的,但在实践中,您需要知道模块的确切名称。使您的事件足够通用,以便您可以在不丢失功能的情况下就地交换模块,并防止/避免直接访问其他模块,并且您可以很好地耦合。

    如果有任何不清楚的地方,请告诉我,我会尽力澄清。

    【讨论】:

    • 这是对理论的很好解释,但是如果你能指出一些代码,那真的很有帮助。它通常只有在我看到示例时才会点击!
    • 我不使用 Backbone,所以我不能给你一些骨干式的东西。相反,我会告诉你我最喜欢的 pubsub 实现:github.com/postaljs/postal.js。具有 GoF 中介者模式中描述的所有功能 + 通道 + 大量很酷的功能实现,并且代码易于阅读......并且可能独立使用。
    【解决方案2】:

    有趣的是,我非常喜欢的一个库叫做Mediator

    网站上有很好的例子,但很粗略:

    $.getJSON('url/to/json', function(json) {
        mediator.publish('myData:loaded', {response: json});
    });
    
    // Somewhere else
    mediator.subscribe('myData:loaded', function(json) {
        // Do something
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 2019-10-03
      相关资源
      最近更新 更多