我正在阅读有关事件样式架构的内容并遇到了这个
有不同的方法来传递通知,但最常见的技术使用间接方法调用,该方法调用是通过在运行时初始化的指针进行的。
但是当 Java 没有指针时,它如何传递通知?
我正在阅读有关事件样式架构的内容并遇到了这个
有不同的方法来传递通知,但最常见的技术使用间接方法调用,该方法调用是通过在运行时初始化的指针进行的。
但是当 Java 没有指针时,它如何传递通知?
Java 的事件系统基于观察者模式,除了在 Java Swing 中,一切都称为“侦听器”而不是“观察者”,并且通常实现EventListener
(正如您可以从该链接顶部的野兽中看出的那样)。
例如,像 a 这样的组件JButton
允许您向其添加侦听器,以关注按钮何时发生某些事情。如果您的听众关心按钮点击,您可以添加一个ActionListener
按钮,JButton
并将其添加到一个内部列表以供以后使用(具体来说,它使用EventListenerList
)。当用户单击该按钮时,JButton
该类将“触发”一个事件给ActionListener
已向其注册的所有实现。
这基本上是观察者模式,因为您有一个正在被观察的主题(JButton
)和一个希望收到有关主题更改或事件的通知的观察者(ActionListener
)。
Java 本身没有指针,但这并不意味着这不能完成。在 C++ 中,您可以将函数指针传递给主体,主体将调用该函数。由于 Java 没有函数指针,因此您将实现特定接口的对象传递给主体,主体将调用该接口上的确切方法。在上面的示例中,这就是ActionListener.actionPerformed(ActionEvent)
方法。
请注意,这种方法在 Swing 之外的其他 Java 库中也很流行,因为缺少函数指针等机制以及 Java 接口的流行。
Java Swing 使用侦听器来传递有关事件的通知。
这是 Swing 类的代码片段
Font font = model.getActivityFont();
activityTextFontButton = new JButton(getFontText(font));
activityTextFontButton.setFont(font);
activityTextFontButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
JFontChooser fontChooser = new JFontChooser();
fontChooser.setSelectedFont(model.getActivityFont());
int result = fontChooser.showDialog(dialog);
if (result == JFontChooser.OK_OPTION) {
Font font = fontChooser.getSelectedFont();
String text = getFontText(font);
model.setActivityFont(font);
activityTextFontButton.setText(text);
activityTextFontButton.setFont(font);
JButton dummy = new JButton(text);
setButtonSizes(activityTextFontButton,
connectorTextFontButton, dummy);
dialog.validate();
dialog.pack();
}
}
});
当按下按钮时,JButton 类执行属于 ActionListener 的代码。那是因为 JButton 类具有对 ActionListener 实例的引用,并且知道要执行的方法是 actionPerformed。
Java 中还有其他方法可以驱动事件(请参阅 Observer / Observed 类),但侦听器是传递有关事件的通知的一种非常酷的方法。