我该如何实施?它可以跨多个程序集工作吗?如果没有,我怎样才能让它工作?
1 回答
冒着不完全理解这个问题的风险,我想提供另一种可能的解释。
谈到类,Java 有一个EventListener,.NET 有一个EventHandler。两者都有相同的目的:事件处理。但是在实现上存在差异。可以说,.NET 的事件处理是对 Java 事件监听器的更高层次的抽象。
Java 的 EventListener 是“所有事件监听器接口都必须扩展的标记接口”(即 MouseListener)。.NET 的 EventHandler 是一个委托,是一个指向处理事件的方法的强类型指针。
更广泛地说,事件侦听器是实现事件处理接口的对象,而事件处理程序只是处理事件的方法。一般来说,事件侦听器实现了一个观察者设计模式,而事件处理程序隐藏了该模式的所有管道。因此,编写一个事件监听器比编写一个事件处理程序更复杂,而且往往更加口头化。
我建议阅读 Microsoft 的Observer Design Pattern以更好地理解它。
因此,要实现事件处理程序,您只需将委托分配给您要处理的对象的事件。IE
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 接口。但这应该说明这一点。