0

我会尽量做到客观:) 我想知道有人需要如何以及为什么需要为您创建自己的活动。我实际上知道该怎么做,但我不知道做这样的事情的真正想法。你能给我一个例子来解释为什么要创建你自己的事件吗!?

我在网上寻找这个答案,但我从来没有找到它......

对不起我的英语:)

4

4 回答 4

2

让我们尝试将观察者模式与“手动”对象通知系统进行比较……我相信每个人在开始编程时都对此感到内疚。

public class GameX{
   public function GameX(){
      var b = new Button(this); //we send a reference to button
   }
   public function buttonAction(){
       //do something based on this
   }
}

public class Button(){
   private var listener:
   public function Button(listener:GameX){
      this.listener = listener;
      someButtonThing();
   }
   public someButtonThing(){
      listener.buttonAction();
   }
}

让我们遍历此代码会遇到的问题...

1) 我想在另一个游戏 GameY 中使用 Button 类?那是问题吗?

当然,在按钮类中对 GameX 的编译时间依赖性......是的,你可以改变它或以其他方式作弊,但这并不容易或标准化......标准化可能是观察者的关键事情之一模式……为什么这么好。这也打破了封装……稍后会详细介绍。

2)我想同时收听GameYComponent1和GameYComponent2!我可以做吗?

同样,您可以“作弊”并更改此代码,但同样,您必须更改 Button 类,并且再次,它不会像观察者模式(事件事物)那样标准化。很多时候你根本不能......你能做的最好的就是继承它。工作太多。也不规范。

3)您想要某种非常复杂的事件调度机制,例如 as3 中的显示对象列表(对不起,我现在在网上找不到很好的链接,如果有人可以稍后编辑,请添加中的链接)。

我可以迭代到明天,并且有人可以比我更好地解释它,但基本上,不使用观察者模式可能会破坏封装并迫使您一遍又一遍地修改 Button 类......它也不会像随着事件的标准化......无需重新发明轮子,观察者模式就是为了解决这些问题而创建的。

无论如何,这就是我将如何在 15 分钟内向刚接触编程的人解释为什么要使用事件或自定义事件。它避免了所有相关人员的大量头痛。

要进行更全面的研究,请尝试这些链接(我只是掩盖了这些事情,但这里应该有一些真相):

如果有人有更多更好的链接要添加,请随意。

此外,这很好,因为它有助于封装一点,Button 类对世界的了解越少,反之亦然越好(无需赘述,同样,有人可能会更好地解释这一点):

如果有人有更多更好的链接要添加,请随意。

另外,我一直提到但没有详细说明的事情,每个有一点经验的人都了解事件并可以关注它们。事件会使新程序员难以理解代码,并且与具体的参考链接相比更难理解,但成本大于收益。这就是我说观察者模式的标准化可能是其重要性的关键之一时的意思。

告诉我这对你是否有意义。

于 2011-07-21T21:03:07.623 回答
1

我为一切创建自己的事件。例如,我有一个 Sprite,它有一个子 Sprite。子 Sprite 根据一组颜色值一直在改变颜色。我想通知某些其他精灵,这个精灵现在是红色的,但我不知道它什么时候会发生,因为它正在随机迭代颜色数组。当满足该条件时,子精灵可以触发一个事件,并且任何正在监听的人都可以对其做出反应。

否则,每个想知道雪碧什么时候红的人都得问孩子,你红吗,你红吗,你红吗?

于 2011-07-21T20:03:00.833 回答
1

我在自定义事件上发表的帖子

自定义事件只是让您更好地控制应用程序中的事件结构。也许最重要的是,是否与这个或那个操作的语义相关:XML 加载成功?开火MyEvent.XML_LOAD_COMPLETE

正如我在帖子中详述的那样,您还可以使用新功能扩展自定义事件,特别是在我的情况下,以处理触发事件旁边的额外数据。

这非常方便。

希望有帮助

于 2011-07-21T20:09:45.653 回答
1

当我需要在事件对象上存储更多信息时,我将创建自己的事件。这样,当我在侦听器中处理事件时,我可以访问所需的数据,而无需将其存储在 event.target 对象上。

作为旁注,我发现信号库可以更好地实现这一点。

于 2011-07-21T20:10:28.163 回答