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

4

2 回答 2

1

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

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

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


开始学习事件的一个好地方是Swing 教程中的事件监听器简介。

于 2012-06-25T03:52:09.707 回答
1

听起来您想要的是一个发布/订阅(或发布/订阅)系统。查看EventBusGuava 库中的实现

于 2012-06-25T05:12:10.010 回答