2012-06-25 93 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)你可以安排每个组件对象用容器对象注册一个事件监听器。如果您需要一个组件才能将事件发送到其他组件,那么容器需要公开一个方法来执行此操作。 –