2014-06-23 134 views
0

我想實現Java中的觀察者模式。觀察者設計不起作用

我有具有以下嵌套類

public class TitleInformer extends Observable { 
    private String title = ""; 

    public void SetTitle(String s) { 
     title = s; 
     this.notifyObservers(); 
    } 
} 

當我構建PlannerView類,我初始化觀察到這樣

public PlannerView(ProjectController projectController) { 

    titleInformer = new TitleInformer(); 
    titleInformer.addObserver(this); 
} 

現在類PlannerView extends Observer,我通過我的觀察到titleInformer到我在PlannerView類中創建的另一個對象

actionView = new ActionView (titleInformer); 

另一類actionView,現在有這樣的

public ActionView(TitleInformer ti) { 
    this.titleInformer = ti; 
} 

引用的可觀測要求的可觀察的方法,這種方法

titleInformer.SetTitle("New Project"); 

但早在PlannerView,其中嵌套可觀察到的是,這最後的方法沒有被調用

public void update(Observable o, Object arg) { 
    System.out.println(1); 
} 

爲什麼?

+0

沒有看過你的所有代碼,但爲什麼PlannerView構造函數會忽略它的ProjectController參數? –

+0

我把它剪掉使它更具可讀性 – Saphire

+0

然後完全刪除參數。否則,它會讓我尋找它給我一個紅色的聽證會,讓我把它看作是你的問題的一個可能的原因。 –

回答

4

您必須在通知觀察者之前指出已做出更改。

public void SetTitle(String s) { 
    title = s; 
    this.setChanged(); // first 
    this.notifyObservers(); 
} 

作爲notifyObservers()方法的Javadoc狀態

如果對象已改變,由所述hasChanged方法, 則通知其所有觀察者,並調用clearChanged方法 ,以指示所指示的該對象不再改變。

This hasChanged property is set by the setChanged method。