2012-09-04 24 views
2

我在讀有關事件風格的建築,整個這個通知如何在JAVA中進行?

有不同的方式傳遞通知來了,但最常見的 技術使用的是通過在運行時初始化的指針 作出了間接的方法調用。

但是,當Java沒有指針時,它如何傳遞通知?

+4

Java的指針很好,只是沒有指針算術(你不需要這個和其他許多東西),他們稱之爲引用。沒有函數指針,但多態。 – delnan

+0

Delnan說的 - Java確實有指針 - 它只是稱它們爲「引用」。 –

回答

1

Java的事件系統是基於Observer模式,除了在的Java Swing,一切都被稱爲「聽衆」,而不是「觀察員」,並且通常實現EventListener(你可以從獸在該鏈接的頂部告訴)。

例如,諸如JButton之類的組件允許您添加監聽器,以監聽按鈕發生什麼情況。如果您的聽衆關心按鈕點擊,您可以將ActionListener添加到該按鈕,並且JButton將其添加到稍後使用的內部列表(具體而言,它使用EventListenerList)。當用戶點擊按鈕時,JButton類將會向所有已註冊的ActionListener實現「發射」一個事件。

這基本上是觀察者模式,因爲您有一個正在觀察的主題(JButton)和一個希望被通知主題的更改或事件的觀察者(ActionListener)。

Java本身沒有指針,但這並不意味着無法完成。在C++中,你可以傳遞一個函數指針給主體,主體只需調用該函數。由於Java沒有函數指針,因此您將一個實現特定接口的對象傳遞給主題,主題將在接口上調用精確的方法。在上面的例子中,這將是ActionListener.actionPerformed(ActionEvent)方法。

請注意,除了Swing之外,此方法在其他Java庫中也很流行,因爲沒有像函數指針這樣的機制和Java接口的流行。

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類),但偵聽器是傳遞有關事件通知的非常酷的方式。

+0

似乎合法謝謝(Y) – Pradit

+1

而聽衆是由一個「參考」,在任何其他語言將被稱爲「指針」解決。 –