是否推荐使用中介模式?

bod*_*ser 16 javascript design-patterns javascript-events mediator

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

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

通常我正在设置已经提供subscribe(),publish()方法的对象.Concrete Objects扩展此基础对象,以便subscribe()和publish()始终注册为原型属性.

据我所知,中介模式用于将发布 - 订阅 - 方法添加到对象.

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

或者我理解调解员模式错了吗?

问候

Jos*_*eph 21

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

  • 中介模式为要使用的模块提供标准API.

    我们举个例子:

    您的应用程序的数千个模块严重依赖于jQuery $.post.如果突然,你的公司有许可问题,并决定转移到,例如,MooTools或YUI,你会找到使用的所有代码$.post并用类似的东西替换它们MooTools.post吗?

    中介模式通过规范API来解决这一危机.模块知道的是,你的中介有一个post函数,无论使用什么库,都可以执行AJAX post.

    //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
    
    Run Code Online (Sandbox Code Playgroud)
  • 调解员充当了模块间交流的"中间人".

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

    MyClassA.something = MyClassB.method();
    MyClassB.something = MyClassA.method();
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    这种"匿名"订阅导致部分松散耦合.模块仍然需要知道要监听哪些模块或者至少要监听一组事件,但它们的连接方式如果取出其中任何一个都不会导致破损.他们所知道的只是他们订阅了这个事件,并且会在事件发生时执行 - 无论是谁发射它,它是否触发,或触发器是否存在.

  • @hguser第一部分是立面.第二部分是调解员. (2认同)