3

Java可以用作通用回调机制的更可取的接口或类似模式应该是什么?

例如,它可能类似于

public interface GenericCallback
{
    public String getID();
    public void callback(Object notification);
    // or public void callback(String id, Object notification);
}

对于覆盖方法的情况,将需要 ID,hashCode()以便被调用者识别调用者。

像上面这样的模式对于需要向类报告它们是从某个条件(例如,处理结束)产生的类的对象很有用。

在这种情况下,“父”类将使用getID()这些对象中的每一个的方法GenericCallback来跟踪它们,Map<String, GenericCallable>并根据收到的通知添加或删除它们。

另外,这样的接口实际上应该如何命名?

很多人似乎更喜欢Java Observer 模式,但是其中定义的Observable 类并不方便,因为它不是规避单一继承的接口,而且它具有比上述简单场景实际需要的更多功能。

4

3 回答 3

24

我会根据传递的 Object 类型对回调进行泛化。这对于侦听不同类别事件的 EventListener 尤其有用。例如

public interface Callback<T> {
   public void callback(T t);
}

可以使用类型 T 作为 Map 中的键。当然,如果您想区分采用相同参数的两个回调,例如字符串,那么您需要类似getID().

这是我的旧博客关于将这个用于事件侦听器 的接口Events.Listener对应于Callback<T>上面。Broadcasters使用 Map 根据他们接受作为参数的类来跟踪多个听众。

于 2013-03-07T00:36:58.847 回答
4

我推荐使用观察者模式,因为观察者模式是解耦的黄金标准——分离相互依赖的对象。

但如果您正在寻找通用回调机制,我建议避免使用Java.util.Observable 类。因为 Observable 有几个弱点:它不是一个接口,并且迫使你使用 Object 来表示事件。

您可以像这样定义自己的事件侦听器:

public class MyEvent extends EventObject {
    public MyEvent(Object source) {
        super(source);
    }
}

public interface MyEventListener {
    void handleEvent(EventObject event);
}

public class MyEventSource {
    private final List<MyEventListener> listeners;
    public MyEventSource() {
        listeners = new CopyOnWriteArrayList<MyEventListener>();
    }
    public void addMyEventListener(MyEventListener listener) {
        listeners.add(listener);
    }
    public void removeMyEventListener(MyEventListener listener) {
        listeners.remove(listener);
    }
    void fireEvent() {
        MyEvent event = new MyEvent(this);
        for (MyEventListener listener : listeners) {
            listener.handleEvent(event);
        }
    }
}
于 2013-03-07T00:45:37.833 回答
1

看起来你想实现观察者模式。在这个 url中是 Java 中观察者模式的完整实现。在您的情况下,观察者将是回调。

此外,如果您需要实现更复杂的东西,您最终将使用事件/通知模式。看看这里的其他模式

谢谢,@leo。

于 2013-03-07T00:10:39.440 回答