我一直在阅读四人帮,以解决我的一些问题,并遇到了Mediator模式.
我之前在项目中使用了Observer来制作一些GUI应用程序.我有点困惑,因为我发现两者之间没有太大区别.我浏览找到差异,但找不到任何适合我的查询的答案.
有人可以帮助我区分两者,并用一些明确划分两者的好例子吗?
我一直在研究这两种模式之间的区别.
据我所知,facade封装了对子系统的访问,而mediator封装了组件之间的交互.
我知道子系统组件不知道外观,因为组件明显知道中介.
我目前正在使用facade来封装检索配置信息的方法,例如App.Config,存储在SQL中的用户设置,程序集信息等,以及用于在不同窗体之间导航的介体.
但是,大多数网站都指出调解员"增加了功能".这是什么意思?介体如何添加功能?
有没有人有任何使用MVVM(Prism)显示窗口对话框的例子? - 例如,执行命令时的配置设置窗口.
我见过的所有例子都使用了很好的中介模式,但是他们也都在视图模型中引用了一个不理想的视图(我们使用的是DataTemplates)
谢谢
我正在阅读http://addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascript
我将介体模式理解为某种设置发布和订阅功能的对象.
通常我正在设置已经提供subscribe(),publish()方法的对象.Concrete Objects扩展此基础对象,以便subscribe()和publish()始终注册为原型属性.
据我所知,中介模式用于将发布 - 订阅 - 方法添加到对象.
这种做法有什么好处?提供基础对象的发布和订阅功能,而不是让构建器在构造中设置,这不是更好的做法吗?
或者我理解调解员模式错了吗?
问候
Eventbus更像是调解者还是观察者?据谷歌称,"eventbus mediator"获得2.430次点击,"eventbus观察者"获得3.850次点击.
根据描述,他们都会匹配我想做的事情(调解员甚至更多).那么eventbus实现了一个特定的模式,还是我自己说的呢?
到目前为止,我已经看到了许多问题的解决方案.最简单的是,当然,对$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
有人能指出两者之间的主要区别吗?
似乎至少在概念上,这两者是非常密切相关的.如果我冒险猜测,我会说发布/订阅方法是中介模式的一个子集(因为中介不一定需要以发布/订阅方式使用,但后者似乎需要一种中介宾语).那附近有什么吗?
正如标题所述,您何时会建议使用中介设计模式,哪里看到它使用不正确?
对于那些熟悉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(不使用)
没有循环参考!
我正在尝试使用 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)