2012-07-09 113 views
2

我有以下:Java接口可观察

  1. 的Java类:ClassA的实现观察员

  2. 的Java接口:国际(延伸观察的,不可能)

  3. 的Java类:ClassB实现Inter extends Observable

  4. Java类:ClassC implements Inter extends Observable

现在ClassA的代码有点像这样。

ClassA{ 
    Inter anyClass = new ClassB(); 
      //or it could be 
    Inter anyClass = new ClassC(); 
    //Inter.addObserver(this); //not possible since Interface cannot extend Observable 
} 

现在,如果某个事件发生在ClassB或ClassC中,我希望ClassA知道它。我想过使用Observer/Observable,但问题是Interface无法扩展Observable。

如果有人理解这个问题,请帮助我找到一种方法来在ClassB或ClassC中发生某些事情时更新ClassA。

+0

将ClassA传递给ClassB或ClassC的构造函数。当事情发生变化时他们通知A? – TheZ 2012-07-09 22:22:49

+0

'Observer'和'Observable'之间有区别吗?另外,当你说'更新ClassA'你是什么意思?更新该类或该类本身的特定实例?什么是更新? – 2012-07-09 22:36:24

+0

嗨Nathaniel, 我正在寻找实现Observer/Observable设计模式。 Java已经内置了对它的支持,所以我试图使用它,但看起来我可能无法做到这一点。 – user1216750 2012-07-10 15:53:03

回答

2

由3和4条件我假设Observable是一个类,因为ClassB和ClassC正在扩展它。那么,为什么不把addObserver方法放在Observable类中呢?然后,你可以指定ClassB的或ClassC实例可观察anyClass变量,并通过addObserverMethod注册观察者:

ClassA implements Observer { 
    Observable anyClassB = new ClassB(); 
     //or it could be 
    Observable anyClassC = new ClassC(); 
    anyClassB.addObserver(this); 
    anyClassC.addObserver(this); 
} 
+0

+1:'Observable'是JDK提供的一个类。但是,它已经有了一个'addObserver'方法,这是非常合理的。 – 2012-07-09 23:17:34

+0

谢谢。我现在会这样做。但是,@jagsler建议创建我自己的Observer/Observable模式实现可能是一种更好的方法。我也会研究。 – user1216750 2012-07-10 15:50:29

4

你没有明确必须使用内置的观察者/可观察的Java实现。您可以创建自己的接口来使用观察者模式。

创建将被用于再ClassA的

使用“内部”接口作为可观察到的,确保其与方法“更新”或“通知”(或类似的东西)的接口观察实现:

- registerObserver(Observer) 
- unregisterObserver(Observer) 
- notifyObservers() //(or updateObservers(), which calls the update/notify method for all registered observers) 

使实现了“国米接口也有一个名为observerCollection一个ArrayList跟踪观察员肯定班。然后,每当ClassB或ClassC中的某些内容发生变化时,您想告诉ClassA(观察者),可以调用notifyObservers()让它知道某些内容已更改。

看看这个,看看与观察者设计模式会发生什么:http://en.wikipedia.org/wiki/File:Observer.svg

2

简单地定义自己的接口的IObservable与占有方法的addObserverdeleteObserver

public interface IObservable { 
    void addObserver(Observer o);  
    void deleteObserver(Observer o);  
} 

你的接口可以扩展这一的IObservable接口:

public interface inter extends IObservable { 
... 
} 

在你的A类和B,在的addObserverdeleteObserver方法会从可观察类被继承和不需要定义。

public class A extends Observable implements inter { 
... 
}