0

假设有一个 buttonView(即一个简单的按钮)。要在我的 rootView 中注册点击,我执行以下操作:

一般遵循第一种方法:class RootView { var buttonView:ButtonView; .... buttonView.addEventListener(ButtonView.CLICK, buttonView_click) ; ... }

我想知道,为什么不遵循这样的基本方法(第二种方法):

class RootView 
{
   var buttonView:ButtonView ; 
   buttonView.setFunction( buttonView_click ) ;

}


class ButtonView()
{
    public function setFunction(  someFunction:Function)
    {
        viewFunctionArray_Arr.push( someFunction ) 
    }

    public function onClick()
    {
        // remove dispatchEvent from here , instead 

        for ( var i=0; i< viewFunctionArray_Arr.length; i++)
        {
            //calling the registered functions of all the views one by one
            viewFunctionArray_Arr[i] ( ) ; 
        }

    }


}

如果解释是关于“松散耦合”的,那么我想知道“第一种方法”是如何松散耦合的,因为毕竟在第一种方法中,我们在需要它的视图中使用实例“buttonView”。所以rootView需要了解buttonView。不是吗?

4

1 回答 1

0

当您使用addEventListener()Flash 播放器时,您所做的事情与您的第二种方法非常相似。

我会使用addEventListener()而不是传递对函数的引用的一个原因是避免潜在的内存泄漏:

addEventListener()有一些可选参数。最后一个指定使用弱引用:addEventListener(MouseEvent.CLICK, eventHandler, false, 0, true). 弱引用不会阻止对象被垃圾回收。

在某些情况下,您需要清理对象(即:删除事件侦听器),并且使用弱引用可以减轻一些清理任务。

关于松耦合,我认为这两种方法是相同的。在一种情况下,父对象需要知道子视图调度了一个事件。另一方面,父级需要知道它应该将事件处理函数传递给视图。在我看来,它们都是松散耦合的,没有什么能阻止你在其他地方使用子视图。

于 2012-06-07T16:20:21.913 回答