gpt4 book ai didi

java - 观察者设计——如何访问method.invoke作用域?

转载 作者:行者123 更新时间:2023-11-29 06:18:31 25 4
gpt4 key购买 nike

我目前有一个 Java Observer/Observable 设置,我在其中打开 Observer.update 的 Object 参数中的某个字段(例如事件 ID)以确定如何处理 Observable 通知。

这会产生冗长的代码,例如:

public void update (Observable o, Object arg) {
if (arg instanceof Event) {
switch (((Event)arg).getID()) {
case EVENT_TYPE_A:
// do stuff...
break;
case EVENT_TYPE_B:
// do stuff...
break;
case EVENT_TYPE_C:
// do stuff...
break;
}
}
}

来自 ActionScript 背景,这对我来说感觉过于冗长...与其传递一个 Observer 实例,我更愿意传递一个由 Observable 直接调用的回调方法(更具体地说,由子类调用) ).但是,我不清楚如何确定应该调用该方法的对象(“拥有”该方法的类实例)。

我可以传递对包含该方法的实例的引用,但这闻起来像糟糕的 OOP。

我是不是找错树了?还是有一种干净的方法来实现这一目标?

最佳答案

这可能有点离题,但由于 Java 5 及更高版本具有泛型,传统的观察者和监听器模式似乎都有点过时。也就是说,类型是当今 Java 的通用语言。具有整数 ID 的事件之所以存在,主要是因为针对常量的 switch 语句非常高效——以牺牲可读性为代价,并且通常需要转换才能做任何有用的事情(你可能知道如果 ID = 23,对象必须是 MouseEvent,但它更好如果你让编译器和运行时类型信息为你处理这件事,会更安全)。在现代 JVM 中的现代机器上,效率可能不值得。

所以,如果你不喜欢 ID 和传统的观察者模式,你可能会考虑这样的事情:

public abstract class Observer<T> {
private final Class<T> type;

protected Observer(Class<T> type) {
this.type = type;
}

//implement this method; if it returns false, the event (object)
//is "consumed" and no other observers should be called
public abstract boolean onEvent(T instance);

protected final boolean matches(Object obj) {
return type.isInstance(obj);
}

Boolean maybeDispatch(Object o) {
if (matches(o)) {
return onEvent(type.cast(o));
}
return null;
}
}

这让我们(字面上)成为一个通用的事件观察者;我们像这样打开传入对象的类型:

public class Bus {
private final List<Observer<?>> observers = new ArrayList<Observer<?>>();

public void registerObserver(Observer<?> observer) {
observers.add(observer);
}

public <T> void onEvent(T t) {
Boolean keepGoing;
for (Observer<?> obs : observers) {
keepGoing = obs.maybeDispatch(t);
if (keepGoing != null && !keepGoing.booleanValue()) {
break;
}
}
}
}

生成的代码(略微)效率较低,但编写此类“观察者”的子类可读性更高。它看起来不太像传统的观察者模式,但在功能上是等效的。

如果您仍然需要一个额外的“事件”参数,您可以执行类似的逻辑来对两种类型进行参数化。

关于java - 观察者设计——如何访问method.invoke作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4129280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com