我试图将Observer设计模式理解为主要事件调度设计模式.观察者模式似乎是发布 - 订阅设计模式的类型或类型,我想知道为什么有两个相似的外观设计模式以及我应该如何在两者之间进行选择.
在这两种情况下,信息消息都在实体之间发送,在这两种情况下,实体必须以某种方式注册或订阅才能接收消息.
两种设计模式之间的主要区别似乎是:
我想到的一个想法是,在多线程应用程序中,可以在多个线程之间进行通信而不是Observer模式时使用Publish-Subscribe模式.也许Observer模式可以在进程之间使用,例如进程注册与另一个进程注册,以便在事件发生时得到通知.一个示例是农场管理仪表板应用程序,其注册多个动物饲料箱,如果由箱测量的饲料水平或重量下降到某个阈值以下则通知.
这两种设计模式之间是否存在其他重要差异,这些设计模式可以为选择一种模式提供标准?
design-patterns publish-subscribe event-dispatching observer-pattern
我希望创建自己的事件并发送它们.我之前从未在C#中做过这件事,仅在Flex中.我想必须有很多不同之处.
有人能为我提供一个很好的例子吗?
我有一个带有模型和视图的Swing应用程序.在视图(GUI)中有许多组件,每个组件映射到模型对象的某些属性并显示它的值.
现在有一些UI组件在UI中的值发生更改时会自动触发某些模型属性的更新.这需要我在UI中重新加载完整的模型.这样我就进入了一个无限的更新循环,因为UI中的每个模型重新加载都会触发另一个模型重新加载.
我有一个标志指示加载过程,我想用它来暂时禁止监听器通知,同时从模型中设置UI字段.所以我的问题是:
有没有办法在Swing中全局暂时禁用某些组件的侦听器而无需删除并重新连接它们?
我在这里有一个简单的例子,它不是在Chrome 11中为我开火http://jsfiddle.net/G9mJw/,它包含一个非常简单的代码:
var dropzone = document.getElementById('dropzone'),
draggable = document.getElementById('draggable');
function onDragOver(event) {
var counter = document.getElementById('counter');
counter.innerText = parseInt(counter.innerText, 10) + 1;
}
dropzone.addEventListener('dragover', onDragOver, false);
Run Code Online (Sandbox Code Playgroud)
它似乎在safari中工作得很好......但是在Chrome中,dragover当红色方块触摸虚线时,事件不会被调用.
我试图复制一些目前正在使用chrome的示例,但它对我来说也不起作用.
我已经尝试阻止默认行为,如果工作但看不到它.任何帮助将非常感激.
谢谢
我需要在我自己的代码库(自定义PHP库)中集成一个事件调度程序,所以我看看Symfony2和Zend Framework 2正在做什么.
显然,没有用于调度事件的共享接口,因为两个框架都有不同的需求并决定实现自己的代码......所以我有点迷失:我不想重新发明我的个人轮子.
用于实现观察者模式的SPL接口可能有点幼稚,所以我在这里问你:你会做什么?
编辑
由于目前尚不清楚......我想重新使用现有的ED,让开发人员将其注入我的库中.
假设您使用调度程序开发了一个lib,并且您知道您的lib将成为Symfony Bundle的一部分并在ZF项目中重复使用:您肯定希望重新使用Symfony和ZF调度程序,而不是您自己的.
因此,我一直在寻找在主流库中实现的现有调度程序的共享接口,但听起来似乎没有解决方案.
php zend-framework event-dispatching symfony observer-pattern
我想在我的应用程序中实现Observer Pattern(不是php,这就是为什么不使用Symfony的组件).
虽然组件没有使用类来传播或监听事件,但我发现它很奇怪,因为这样可以使用继承来监听整个事件树.
我看不到使用基于名称的听众的单一优势,你能帮我解决一下吗?
我是新手,任何帮助表示感谢.
在这段代码中,我正在翻牌,如果事实证明他们不匹配,我希望他们再次面朝下.
目前正在发生的事情:1.当点击时,第一张卡翻过来2.当点击第二张卡时,发生两件事情中的任何一件(a)如果他们是相同的他们都熬夜这是我想要的(b)如果他们是不一样的我从来没有看到第二个卡,就好象它立即重新显示卡的背面(也为我的方法定义的前面卡的背面).
我认为放入睡眠计时器可能会让第二张卡显示一段时间后再转回,但事实并非如此.
我试图使用contentPane.revalidate(); &contentPane.repaint(); 但它没有改变任何东西.
我已经输入了一些控制台输出:
Console output:
Card: 0 set
Card: 6 set
Sleeping now
Card: 6 unset
Card: 0 unset
Run Code Online (Sandbox Code Playgroud)
上面是单击两张不匹配的卡时产生的控制台输出
@Override
public void actionPerformed(ActionEvent e)
{
String buttonPressed = e.getActionCommand();
int pos = Integer.valueOf(buttonPressed);
action = Control.model.ReceiveCardsTurned(pos);
keypadArray[pos].setIcon(myIcons[pos]);
System.out.println("Card: "+pos+" set");
currentTime.setText("" + Control.model.time);
currentScore.setText("" + Control.model.score);
//contentPane.revalidate();
//contentPane.repaint();
if(Control.model.twoCardsTurned == false)
{
if (action == "unturn")
{
System.out.println("Sleeping now");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
keypadArray[pos].setIcon(back);
keypadArray[Control.model.lastCard].setIcon(back);
System.out.println("Card: "+pos+" unset"); …Run Code Online (Sandbox Code Playgroud) Symfony v3.3.4,Doctrine ORM v2.5.6
我已经为一个理论实体创建了一个事件订阅者:
AppBundle\EventListener\LivreSubscriber:
tags:
- { name: doctrine.event_subscriber }
Run Code Online (Sandbox Code Playgroud)
它工作正常!但是很长时间以来,我都坚信它没有用,因为在debug:event-dispatcher命令中未列出侦听器:
$ docker-compose exec phpapp bin/console debug:event-dispatcher doctrine.event_subscriber
[WARNING] The event "doctrine.event_subscriber" does not have any registered listeners.
Run Code Online (Sandbox Code Playgroud)
事件监听器是相同的。而且:symfony探查器(“事件”部分)中都未列出侦听器和订户...这样可以正常工作,但是奇怪的是侦听器中没有列出侦听器,不是吗?
你能告诉我你的项目是否有同样的行为吗?
我想以编程方式触发 d3-drag 的“结束”事件。我有一些圈子,并像这样实现了它们的拖动处理:
...
.call(d3.drag()
.on("drag", function () {...})
.on("end", function () {...})
)
Run Code Online (Sandbox Code Playgroud)
现在,稍后在我的代码中,我想以编程方式触发“结束”部分。
我已经尝试过这样的事情:
d3.select("#myID").dispatch("end");
d3.select("#myID").dispatch("dragend");
d3.select("#myID").call(d3.drag().dispatch("end"));
Run Code Online (Sandbox Code Playgroud) 我很难为 Webhook 调度系统找出可靠且可扩展的解决方案。
当前系统使用RabbitMQwebhook 队列(我们称之为events),该队列被消耗和调度。该系统运行了一段时间,但现在出现了一些问题:
RabbitMQ文档而言,该 API 在过滤非空队列或未分配消费者的队列方面非常有限。Kafka我了解,在阅读有关它的所有内容后,情况在单个分区的范围内是相同的。那么,问题是 - 有没有更好的方法/系统来实现此目的?也许我缺少一个非常简单的解决方案,可以让一个用户不干扰另一个用户?
提前致谢!
events ×3
symfony ×3
java ×2
javascript ×2
php ×2
swing ×2
apache-kafka ×1
c# ×1
concurrency ×1
d3.js ×1
doctrine-orm ×1
rabbitmq ×1
symfony-3.3 ×1
timer ×1
webhooks ×1