gpt4 book ai didi

java - 重命名 Java 中观察者模式的实现方法

转载 作者:搜寻专家 更新时间:2023-10-31 20:06:51 26 4
gpt4 key购买 nike

我正在使用 Java 中的 Observable 类/Observer 接口(interface)来实现观察者模式。 Observer 接口(interface)需要重写 update(Observable o, Object arg) 方法。

问题是我正在观察相当多的类,而我的 update() 方法变得非常大:

public class Foo implements Observer {
....

public void update(Observable o, Object param) {
if (o instanceof A) {
// large chunk of code
...
} else if (o instanceof B) {
// large chunk of code
...
}
...
} else if (o instanceof H) {
...
}
}

}

为了拆分该方法,我正在考虑使用例如扩展 Observer 接口(interface)AObserver 接口(interface),BObserver 接口(interface).. 需要分别覆盖 onAUpdate,onBUpdate ..。此方法还可以根据类正在实现的接口(interface)轻松确定类正在观察的 Observable。

class Foo implements AObserver, BObserver {
....

public void onAUpdate(Observable o, Object param) {
if (o instanceof A) {
// large chunk of code
...
}

public void onBUpdate(Observable o, Object param) {
if (o instanceof B) {
// large chunk of code
...
}
}

问题是如果我继承Observer,我还是要实现update()方法。我无法将其重命名为 onAUpdate 或我选择的其他名称。

有什么建议吗?谢谢。

最佳答案

我建议创建一个 UpdateHandler 接口(interface)来处理任何给定的代码块。每个案例都可以用一张 map 来处理。

示例代码如下:

// Interface to implement for each case
public interface UpdateHandler {
public void update(Observable source, Object data) ;
}

按如下方式将实例字段添加到您的主类:

private Map<Class<?>, UpdateHandler> handlers = new HashMap<Class<?>, Update Handler>();

Create a method to have the handlers initialized

protected void initializeHandler() {
handler.put(Integer.class, new IntegerUpdateHandler());
handler.put(String.class, new StringUpdateHandler());
...
}

updates 方法将简单地找到合适的处理程序并分派(dispatch)调用

public void update(Observable source, Object data)
{
UpdateHandler handler = handlers.get(data.getClass()) ;
if (handler == null)
{
// use a default handler ? throw an exception ? your choice ;)
} else {
handler.update(source, data) ;
}
}

此实现将允许您根据需要以最少的更改添加新的处理程序。

另一种可能的实现可以在之前的工作的基础上完成,只需 3 个步骤。

1) 更改处理程序字段的声明。

Map<Class<?>, Class<? extends UpdateHandler>> handlers ;

2) 改变初始化方法

handlers.put(Integer.class, IntegerInputHandler.class);

3) 更改主更新方法以创建所提供的 UpdateHandler 实现的新实例。

UpdateHandler handlerInstance = null ;
Class<? extends UpdateHandler> handler = null ;
handler = handlers.get(data.getClass()) ;
...
handlerInstance = handler.newInstance() ;
handlerInstance.update(source, data) ;

关于java - 重命名 Java 中观察者模式的实现方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4263258/

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