【问题标题】:Observer Pattern vs Mediator Pattern观察者模式与中介者模式
【发布时间】:2014-10-14 13:38:18
【问题描述】:

我做了一些谷歌搜索,是的,我知道以前在 stackoverflow 和整个网络上都曾询问过关于这两者之间区别的问题。但我大多找到措辞的答案,这可能会令人困惑。

我的问题是,这里是否有人可以为我提供两个关于中介者和观察者模式的视觉示例,可以清楚地展示两者之间的区别。在 Javascript 中。谢谢!

【问题讨论】:

标签: javascript observer-pattern mediator


【解决方案1】:

是的,它们是不同的。我将基于一个典型的单页 Web 应用场景,通过现实生活中的示例进行解释。我假设您的网页遵循典型的 Model-View-XXX 模式,因此您会有“视图”。通过视图,我了解一个 javascript 组件负责页面某些部分的视觉表示和相关逻辑 - 标题、图像列表、面包屑都是典型的视图。

观察者

最适合用于对网站整体功能影响很大的单个对象。典型示例是用户设置或站点配置。

var settings = {
  fonts: "medium",
  colors: "light",
  observers: [],
  addObserver: function (observer) {
     this.observers.push(observer);
  },
  update : function(newSettings) {
     for (k in newSettings)
         this[k] = newSettings[k];
     this.fire();
  }
  fire: function() {
     var self = this;
     observers.forEach(function() { this.update(self); });
  }
}

每个视图的行为有点像这样:

var view = {
   init: function() {
      //... attach to DOM elements etc...
      settings.addObserver(this); 
   },
   update: function(settings) {
      //... use settings to toggle classes for fonts and colors...
   } 
}

调解员

当您的网站的多个部分需要按特定逻辑进行编排时,最适合使用。如果您最终通过多个回调跟踪单个用户操作并最终通过事件传递状态,那么引入中介可能是有意义的。每个工作流将有一个调解员。一个具体的例子是照片上传。

var uploadMediator = {
    imageUploading: false,
    actors: {}, 

    registerActor: function(name, obj) {
       actors[name] = obj;
    },

    launch: function() {
       if (imageUploading)
             error('Finish previous upload first');  
       actors['chooser'].show();
       actors['preview'].hide();
       actors['progress'].hide();
    }

    selected: function(img) {
      actors['preview'].show(img); 
    }   

    uploading: function(progressNotifier) {
      imageUploading = true;
      actors['progress'].show(progressNotifier);
    }

    uploaded: function(thumbUrl) {
       //show thumbUrl in the image list
       imageUploading = false;
    }

}

当您的页面初始化时,所有参与者(UI 的各个部分,可能是视图)都会向中介者注册。然后它成为代码中的一个地方,用于在过程中实现与状态管理相关的所有逻辑。

注意: 以上代码仅用于演示目的,实际生产需要更多代码。大多数书籍也使用函数构造函数和原型是有原因的。我只是试图传达这些模式背后的最低限度的想法。

当然,这些模式也很容易应用于中间层,例如基于node.js。

【讨论】:

  • 哇。这帮助了很多。谢谢!
  • 欢迎您。我不是模式的忠实粉丝,我相信编程是一门艺术。找到最佳匹配并通过代码将其传达给下一个程序员的艺术。学习和理解模式并能够实现它们非常有用。但是,在实践中,您最终会稍微更改它们以适应整体情况。如果您检查流行的开源项目,模式几乎从未真正实现过。然而,点点滴滴都结束了,程序员很容易阅读和修复彼此的代码。例如,如果我将观察者命名为侦听器,什么都不会改变。
猜你喜欢
  • 1970-01-01
  • 2012-03-02
  • 2010-09-23
  • 2016-02-20
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多