我正在阅读有关Event Style架构的内容并且遇到了这个
提供通知的方式有多种,但最常见 技术使用通过指针进行的间接方法调用 在运行时初始化。
但是当Java没有指针时,它如何传递通知?
答案 0 :(得分:1)
Java的事件系统基于Observer模式,除了在Java Swing中,一切都被称为“监听器”而不是“观察者”,并且通常实现EventListener
(正如您可以从中看到的)野兽在该链接的顶部)。
例如,诸如JButton
之类的组件允许您向其添加监听器,该监听器关心按钮何时发生。如果您的听众关注按钮点击,您可以在按钮上添加ActionListener
,JButton
将其添加到内部列表中以便稍后使用(具体来说,它使用EventListenerList
)。当用户单击该按钮时,JButton
类将“触发”事件到已向其注册的所有ActionListener
实现。
这基本上是观察者模式,因为你有一个被观察的主体(JButton
)和一个想要被告知主体的变化或事件(ActionListener
)的观察者。
Java本身没有指针,但这并不意味着无法完成。在C ++中,您将传递一个指向主题的函数指针,主题只会调用该函数。由于Java没有函数指针,因此将实现特定接口的对象传递给主题,主题将在接口上调用精确方法。在上面的示例中,这将是ActionListener.actionPerformed(ActionEvent)
方法。
请注意,除了Swing之外,这种方法在其他Java库中也很流行,因为缺少函数指针和Java接口的流行等机制。
答案 1 :(得分:1)
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类),但是侦听器是一种非常酷的方式来传递有关事件的通知。