1

我正在尝试使用传递给notifyObservers方法的对象的属性,但我似乎找不到访问它们的方法。我只能传入一个字符串,但我希望将更多选项传递给观察者。

这是设置示例;

public class UpdateInfo {

          public String data;
          public int debug = 0;
}

public class RXTXComms extends Observable {

         UpdateInfo info = new UpdateInfo();

         public void sendToBoard(String s) {
                .......

                UpdateInfo.data = "test";
                UpdateInfo.debug = 1;
                stChanged();
                notifyObservers(info);
          }  
}

public class Program implements Observer {

     public void update(Observable obj, Object arg) {
            String msg = ""; // Message to display on GUI

            if (arg instanceof UpdateInfo) {
                 //Print out the message and Debug int onto GUI...but how do I access them from `arg`
        }
    }

}

如果我将类型arg设为 be UpdateInfo,那么我会收到一个编译器错误,即我的类Program不是抽象的......

这不是一个诚实、恰当的问题吗?

4

1 回答 1

5

你需要铸造班级。

 UpdateInfo ui = (UpdateInfo) arg;

在你里面instanceof应该做的伎俩。

Java的Observable/ ObserverAPI设计的真的很烂,别用了。说真的 - 它不应该是一个抽象类,而是一个接口。

观察者模式非常简单,只需使用完全类型安全的方式自行实现即可。实际上,即使指定一个更好的接口版本也没有回报。例如,各种Listeners 只是 Java 中这种模式的另一个实例,它执行得更好:侦听器具有具有良好方法名称和额外数据的方法,Adapter如果要实现多个方法,则存在一个抽象,您通常会不需要所有这些(参见例如MouseAdapter)。

因此,为具体用例重新实现模式,而不是为未指定的“如果发生任何事情”案例。模式实际上是为了重新实现,而不是从模式库抽象继承。

于 2012-12-14T23:26:59.143 回答