在 AS3 中放置事件侦听器的最佳位置

Best place to put event listener in AS3

在我的项目中,我有一个 main .as 定义了一个 class.

在 class 中,我有各种其他对象作为成员。其中一个包含有关应用程序状态的信息,我将其注入其他 classes 以便他们都知道发生了什么。

状态 class 也会在事情发生变化时调度自定义事件。

我的问题是,这样做不好吗:

public class SomeClass {

    private var appState:AppState;

    public function SomeClass(appState:AppState) {
        this.appState = appState;
        this.appState.addEventListener(AppState.INFO_UPDATE, this.appStateUpdated);
    }

    private function appStateUpdated(e:Event) {
        //do something with new appstate
    }

}

我喜欢这种方式,但我不确定它以后是否会回来咬我。这是一种可行的方法吗?

你可以使用回调代替eventListeners,这样会更快。

在您的 AppState class 中,您将设置一个数组来保存回调函数,并在更新时调用它们。

public class AppState 
{
    private var callbacks:Array = [];

    public function addCallback(update:function):void
    {
    }

    public function removeCallback(update:function):void
    {
    }

    public function update():void
    {
        for each (var callback:Function in callbacks)
        {
             callback.apply(null, [//maybe some param here]);
        }
    }

}

是的,这样的事件系统或多或少地创建了观察者模式。 (即一个对象观察另一个对象的变化)

基于观察者模式的是 MVC 模式,它以某种方式成为几乎所有应用程序的基础。

其中一部分是 V,view,它观察 M,model 的变化。 在您的情况下,appState 可能是 modelSomeClass 可能是 view(其中 class)。为了观察 modelview 接收到对 model 对象的引用。这通常完全按照您的方式完成。

请记住,永远不要强行使用任何模式。上面的要点是告诉你像这样将一个可观察对象传递给一个 class 是很常见的。但是,这并不意味着它一定是您所处情况的正确选择。 (这很可能是正确的选择,只是不要认为这样做本身就是正确的选择)

销毁 SomeClass 对象时不要忘记清除对 appState 的引用。