2012-06-25 130 views
2

我有一個專門的對象類,發送消息到其組件,以便他們可以根據需要更改自己。對象類允許我混合和匹配組件,這樣我就可以擁有具有類似功能的不同對象,而不需要很大的繼承樹。 (我想這就是所謂的組件模式。)這是我想做的事:如何實現消息發送系統?

//MyObject.java 
public class MyObject { 

    private HashSet<MyComponent> components_; 

    void send(Message message) { 
     for (MyComponent component : components_) { 
      component.receive(message); 
     } 
    } 

    // other unrelated methods and variables... 

} 

// MyComponent.java 
public interface MyComponent { 

    public void receive(Message message); 

    // other unrelated methods... 

} 

// RendererComponent.java 
public class RendererComponent implements MyComponent { 

    public void receive(Message message) { 
     if (message.getType() == Message.Type.POSITION_CHANGED) { 
      Point positionDifference = message.getInfo(); 
      redraw(positionDifference); 
     } else if (message.getType() == Message.Type.SCORE_CHANGED) { 
      Integer score = message.getInfo(); 
      redraw(score); 
     } // else if... 
    } 

    private void redraw(Point positionDifference) { 
     // draws item at new position... 
    } 

    private void redraw(Integer score) { 
     // draws the new score... 
    } 

    // other unrelated methods and variables.. 
} 

我有很多的部件,他們收到很多不同類型的消息。如何編寫我的Message類,以便從中獲取不同類別的信息?我是否需要改變組件類處理消息的方式?

+0

我不太明白你的意思,我怎麼寫我的消息類,以便我可以從中獲取不同類的信息?也許你可以提供一個你想要解決的問題的例子嗎? –

+0

@AlexLynch我希望我的Message類中的getInfo()方法返回具有不同類類型的不同信息(如我的RendererComponent示例所示),以便可以用不同方式處理信息。 – Eva

+0

我不認爲你的getInfo()可以返回一個Object?只要您使用getType()來確認您所接收的對象的類型,我不會預見任何類型安全問題 - 或者不管類型安全性如何,都不會泄氣? –

回答

1

我有一個專門的對象類發送消息到其組件,以便他們可以根據需要自行更改。

正常(易)的方式做這種事情是與Java的內部事件發佈機制。您可以定義一個表示事件的類,以及事件偵聽器/消費者必須使用「事件發生」回調方法實現的接口。事件生產者具有用於註冊事件消費者的註冊方法,並且保存註冊消費者的列表。當生產者想要發送一個事件時,它會創建一個事件對象,然後爲所有註冊的消費者調用「事件發生」回調。

此方法用於整個Java的GUI庫以及其他地方。它重量輕,效率高......可能比通過消息傳遞來做這種事情更好。


Swing教程中的一個開始學習活動的好地方是Introduction to Event Listeners

+0

我認爲,但我對是否可以將事件偵聽器添加到不觸發事件的類感到困惑。你能舉一個簡短的例子來說明如何通過事件來實現它嗎? – Eva

+0

另外,如何確保只有同一對象的組件獲得由該對象的另一個組件發送的事件? – Eva

+0

@Eva - 1)我添加了Swing教程相關部分的鏈接。 2)你可以安排每個組件對象用容器對象註冊一個事件監聽器。如果您需要一個組件才能將事件發送到其他組件,那麼容器需要公開一個方法來執行此操作。 –