我在讀有關事件風格的建築,整個這個通知如何在JAVA中進行?
有不同的方式傳遞通知來了,但最常見的 技術使用的是通過在運行時初始化的指針 作出了間接的方法調用。
但是,當Java沒有指針時,它如何傳遞通知?
我在讀有關事件風格的建築,整個這個通知如何在JAVA中進行?
有不同的方式傳遞通知來了,但最常見的 技術使用的是通過在運行時初始化的指針 作出了間接的方法調用。
但是,當Java沒有指針時,它如何傳遞通知?
Java的事件系統是基於Observer模式,除了在的Java Swing,一切都被稱爲「聽衆」,而不是「觀察員」,並且通常實現EventListener
(你可以從獸在該鏈接的頂部告訴)。
例如,諸如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類),但偵聽器是傳遞有關事件通知的非常酷的方式。
似乎合法謝謝(Y) – Pradit
而聽衆是由一個「參考」,在任何其他語言將被稱爲「指針」解決。 –
Java的指針很好,只是沒有指針算術(你不需要這個和其他許多東西),他們稱之爲引用。沒有函數指針,但多態。 – delnan
Delnan說的 - Java確實有指針 - 它只是稱它們爲「引用」。 –