可以用作通用回调机制的优先Java
接口或类似模式应该是什么?
例如,它可能类似于
public interface GenericCallback
{
public String getID();
public void callback(Object notification);
// or public void callback(String id, Object notification);
}
对于覆盖hashCode()
方法的情况,将需要ID,以便被调用者识别调用者。
如上所述的模式对于需要向条件(例如,处理结束)生成的类报告的对象非常有用。
在这种情况下,"父母" class会使用每个getID()
对象的GenericCallback
方法在Map<String, GenericCallable>
中跟踪它们,并根据收到的通知添加或删除它们。
此外,如何实际命名这样的接口?
许多人似乎更喜欢Java Observer pattern,但定义的Observable class不方便,因为它不是绕过单一继承的接口,它带有比上面实际需要的功能更多的功能,简单场景。
答案 0 :(得分:21)
我会根据传递的Object类型对回调进行泛化。这对于侦听不同类事件的EventListener特别有用。 e.g。
public interface Callback<T> {
public void callback(T t);
}
你可以能够使用类型T作为地图中的键。当然,如果你想区分两个采用相同参数的回调,比如String,那么你需要像getID()
这样的东西。
Here my old blog about using this for Event Listeners界面Events.Listener对应上面的Callback<T>
。 Broadcasters使用Map根据接受的类作为参数来跟踪多个侦听器。
答案 1 :(得分: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);
}
}
}
答案 2 :(得分:1)