如何实现消息发送系统?

时间:2012-06-25 03:38:32

标签: java generics interface

我有一个专门的对象类,它将消息发送到它的组件,以便它们可以根据需要自行更改。对象类允许我混合和匹配组件,这样我就可以拥有具有相似功能的不同对象,而不需要庞大的继承树。 (我认为这被称为组件模式。)这就是我想要做的事情:

//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类以便从中获取不同类类型的信息?我是否需要更改组件类处理消息的方式?

2 个答案:

答案 0 :(得分:1)

  

我有一个专门的对象类,它将消息发送到它的组件,以便它们可以根据需要自行更改。

执行此类操作的正常(且简单)方法是使用Java的内部事件发布机制。您可以定义一个表示事件的类,以及一个事件侦听器/使用者必须使用“事件发生”回调方法实现的接口。事件生成器具有用于注册事件使用者的注册方法,并且保持注册的消费者的列表。当生产者想要发送一个事件时,它会创建一个事件对象,然后为所有注册的消费者调用“事件发生”回调。

这种方法在整个Java的GUI库和其他地方使用。它轻巧而高效......并且可能比通过消息传递做这种事情更好。


开始学习事件的好地方是Swing教程中的Introduction to Event Listeners

答案 1 :(得分:1)