java - 如何实现一个消息发送系统?

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

最佳答案

I have a specialized object class that sends messages to its components so that they can change themselves as needed.

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

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


开始了解事件的一个好地方是 Introduction to Event Listeners在 Swing 教程中。

关于java - 如何实现一个消息发送系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11183227/

相关文章:

java - 当我在 Java 中迭代非泛型映射时,编译器会报错

java - 使用这样的 Jbutton 设置单击 "Next"按钮后,我将如何执行操作?

Java 接口(interface) Start/Stop 已经存在?

java - 通用类型和接口(interface) Java

java - Java8中可以对两个不同的Stream进行比较操作吗?

java - JOOQ 3.1 生成的文件名与类名不同导致编译错误

c# - 带有构造函数的通用类<T>来选择类型

java - Java 删除如何影响通用数组?

java - 如何从我的程序创建 Jar 文件

java.net.SocketException : Connection reset