我该如何实施?它会跨多个组件工作吗?如果没有,我该如何使其发挥作用?
答案 0 :(得分:14)
冒着不完全理解问题的风险,我想提供另一种可能的解释。
谈到类,Java有EventListener,.NET有EventHandler。两者都有相同的目的:事件处理。但是在实施方面存在差异。可以说.NET的事件处理是Java事件监听器的更高级别的抽象。
Java的EventListener是“所有事件监听器接口必须扩展的标记接口”(即MouseListener)。 .NET的EventHandler是一个委托,一个指向处理事件的方法的强类型指针。
更广泛地说,事件侦听器是一个实现事件处理接口的对象,而事件处理程序只是一个处理事件的方法。一般来说,事件侦听器实现Observer Design Pattern并且事件处理程序隐藏该模式的所有管道。因此,撰写event listener更为复杂,而且往往比撰写event handler更加口头。
我建议您阅读Microsoft的Observer Design Pattern以更好地了解它。
因此,要实现事件处理程序,只需将委托分配给要处理的对象的事件即可。即。
Button.Click += new EventHandler(MyButton_Click);
其中MyButton_Click是一个方法(它可能在你的类或其他地方),它具有EventHandler的签名并实际处理事件,即
private void MyButton_Click(object sender, EventArgs e)
{
doSomething();
}
为了用Java中的事件监听器实现相同的目的,你会写这样的东西(原谅我,如果我犯了错误,因为我是从内存中写的):
public class MyClass
{
Button myButton;
MyClass()
{
...
myButton.addMouseListener(new ButtonHandler());
}
public class ButtonHandler implements MouseListener
{
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e)
{
doSomething("Mouse clicked", e);
}
}
}
当然,有很多方法可以实现这种常见的观察者模式,包括在类本身,内部类,匿名类,适配器等中实现EventListener接口。但这应该证明了这一点。