标签: mediator

Mediator Vs Observer面向对象的设计模式

我一直在阅读四人帮,以解决我的一些问题,并遇到了Mediator模式.

我之前在项目中使用了Observer来制作一些GUI应用程序.我有点困惑,因为我发现两者之间没有太大区别.我浏览找到差异,但找不到任何适合我的查询的答案.

有人可以帮助我区分两者,并用一些明确划分两者的好例子吗?

oop design-patterns mediator observer-pattern

84
推荐指数
7
解决办法
3万
查看次数

外墙与调解员

我一直在研究这两种模式之间的区别.

据我所知,facade封装了对子系统的访问,而mediator封装了组件之间的交互.

我知道子系统组件不知道外观,因为组件明显知道中介.

我目前正在使用facade来封装检索配置信息的方法,例如App.Config,存储在SQL中的用户设置,程序集信息等,以及用于在不同窗体之间导航的介体.

但是,大多数网站都指出调解员"增加了功能".这是什么意思?介体如何添加功能?

design-patterns facade mediator

77
推荐指数
4
解决办法
2万
查看次数

WPF MVVM对话框示例

有没有人有任何使用MVVM(Prism)显示窗口对话框的例子? - 例如,执行命令时的配置设置窗口.

我见过的所有例子都使用了很好的中介模式,但是他们也都在视图模型中引用了一个不理想的视图(我们使用的是DataTemplates)

谢谢

wpf prism mvvm mediator prism-2

28
推荐指数
2
解决办法
4万
查看次数

是否推荐使用中介模式?

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

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

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

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

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

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

问候

javascript design-patterns javascript-events mediator

16
推荐指数
1
解决办法
1万
查看次数

Eventbus是中介还是观察者模式?

Eventbus更像是调解者还是观察者?据谷歌称,"eventbus mediator"获得2.430次点击,"eventbus观察者"获得3.850次点击.

根据描述,他们都会匹配我想做的事情(调解员甚至更多).那么eventbus实现了一个特定的模式,还是我自己说的呢?

design-patterns mediator event-bus observer-pattern

14
推荐指数
4
解决办法
7320
查看次数

角度模块中的全局通信:事件总线或中介模式/服务

到目前为止,我已经看到了许多问题的解决方案.最简单的是,当然,对$emit一个事件中$rootScope作为事件总线例如(https://github.com/btilford/anti-patterns/blob/master/angular/Angular.md)

angular.module('myModule').directive('directiveA', function($rootScope) {
  return {
    link : function($scope, $element) {
      $element.on('click', function(event) {
        $rootScope.$emit('directiveA:clicked', event);
      });
    }
  }
});
angular.module('myModule').directive('directiveB', function() {
  return {
    link : function($scope, $element) {
      $rootScope.on('directiveA:clicked', function(event) {
        console.log('received click event from directiveA');
      });
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

另一个是使用中介或pubsub功能/封闭范围声明服务,例如(在多个控制器和指令之间进行通信.)

module.factory('MessageService',
  function() {
    var MessageService = {};

    var listeners = {};
    var count = 0;
    MessageService.registerListener = function(listener) {
      listeners[count] = listener;
      count++;

      return (function(currentCount) {
        return function() { …
Run Code Online (Sandbox Code Playgroud)

javascript design-patterns mediator publish-subscribe angularjs

10
推荐指数
2
解决办法
9067
查看次数

中介模式与发布/订阅

有人能指出两者之间的主要区别吗?

似乎至少在概念上,这两者是非常密切相关的.如果我冒险猜测,我会说发布/订阅方法是中介模式的一个子集(因为中介不一定需要以发布/订阅方式使用,但后者似乎需要一种中介宾语).那附近有什么吗?

c++ oop design-patterns mediator publish-subscribe

9
推荐指数
1
解决办法
4085
查看次数

你何时会使用中介设计模式

正如标题所述,您何时会建议使用中介设计模式,哪里看到它使用不正确?

language-agnostic design-patterns mediator

8
推荐指数
1
解决办法
4356
查看次数

在Delphi中实现Mediator模式而不获取循环引用

对于那些熟悉Mediator模式的人......

我想在Delphi中实现Mediator模式,但是Delphi编译器无法处理所需的循环引用.

查看"设计模式"中的原始GOF图,Mediator具有对每个同事的引用,但许多同事对象都有对Mediator的引用.

这在大多数语言中都不是问题,但是我的Delphi编译器给了我'F2047循环单元引用...'

请问这种方法,使用接口,有什么用处?(似乎很复杂)

我正在使用Delphi 2010

[ 解决方案摘要 ]

只是总结一下接受的答案:在允许循环引用的语言中,您可以省略抽象Mediator类(如第278页的GoF"实现"部分中所述).在没有抽象Mediator类的情况下,在Delphi中实现Mediator的唯一方法是将所有类放在一个Unit中.

否则,除了具体的子类之外,还需要一个额外的抽象Mediator基类.

您对三个单元的使用条款如下所示:

ConcreteColleage1使用Mediator
ConcreteMediator使用Mediator,ConcreateColleague1
Mediator(不使用)

没有循环参考!

delphi mediator

8
推荐指数
2
解决办法
930
查看次数

如何在 C# ASP NET Core 中的后台服务中使用 Mediator?

我正在尝试使用 Mediator 实现后台服务 QueuedBackground 服务。

到目前为止,我能够实现队列,但无法执行调解器。

界面

public interface IBackgroundTaskQueueService
    {
        void QueueBackgroundWorkItem(object workItem, CancellationToken token);

        Task<object> DequeueAsync(
            CancellationToken cancellationToken);
    }
Run Code Online (Sandbox Code Playgroud)

执行

public class BackgroundTaskQueueService : IBackgroundTaskQueueService
    {
        private readonly ConcurrentQueue<(object,CancellationToken)> _workItems =
            new ConcurrentQueue<(object,CancellationToken)>();

        private SemaphoreSlim _signal = new SemaphoreSlim(0);

        public void QueueBackgroundWorkItem(object workItem, CancellationToken token)
        {
            if (workItem == null)
            {
                throw new ArgumentNullException(nameof(workItem));
            }

            _workItems.Enqueue((workItem,token));
            _signal.Release();
        }

        public async Task<object> DequeueAsync( CancellationToken cancellationToken)
        {
            await _signal.WaitAsync(cancellationToken);
            _workItems.TryDequeue(out var workItem);
            return workItem.Item1;
        }
    }
Run Code Online (Sandbox Code Playgroud)

后台服务

public class QueuedHostedService …
Run Code Online (Sandbox Code Playgroud)

c# mediator cqrs asp.net-core

8
推荐指数
1
解决办法
6334
查看次数