假设有一个buttonView (即.一个简单的按钮)。要在我的rootView中注册单击,请执行以下操作:
通常遵循第一种方法:类按钮{ var RootView视图:按钮视图;...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的事。不是吗?
发布于 2012-06-08 00:20:22
当您使用addEventListener()时,Flash player所做的事情与您的第二种方法非常相似。
我使用addEventListener()而不是传递对函数的引用的一个原因是为了避免潜在的内存泄漏:
addEventListener()有一些可选的参数。最后一个指定使用弱引用:addEventListener(MouseEvent.CLICK, eventHandler, false, 0, true)。弱引用不会阻止对象被垃圾回收。
有些情况下,当一个对象被释放时,你需要清理一些东西(例如:删除事件侦听器),使用弱引用可以减轻一些清理任务。
关于松散耦合,我认为这两种方法是相同的。在一种情况下,父对象需要知道子视图调度了一个事件。在另一种情况下,父级需要知道它应该将事件处理函数传递给视图。在我看来,这两者都是松散耦合的,没有什么可以阻止您在其他地方使用子视图。
https://stackoverflow.com/questions/10868757
复制相似问题