2012-07-09 52 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 { 
... 
}