2012-11-04 20 views
9

此問題屬於MVC(模型 - 視圖 - 控制器)。我的模型當前使用Java中的Observer/Observable模式更新了視圖:在Java中使用Observer和Observable模型的設計很糟糕嗎?

public class Model extends Observable { 
} 

public class View implements Observer { 

    @Override 
    public void update(observable o, Object obj) { 
     // ... update the view using the model. 
    } 

} 

這很好。然而,我的模型變得越來越複雜 - 它開始持有其他類的列表:

public class Model extends Observable { 
    List<Person> people = new ArrayList<Person>(); 
} 

public class Person { 
    private String name = ""; 
    // ... getter/setter for name 
} 

我的問題是:當一個人的名字的變化我想更新聽它包含人的模型視圖。我能想到的唯一方法是讓Model實現一個Observer類並讓Person擴展一個Observable類。然後,當Person改變時,他通知他的觀察者(將包括父模型)。

但是,如果我的模型變得複雜,這看起來像很多工作。是否有更好的方法來「改變」父模型?

+1

事實上,使用MVC的設計很糟糕。 –

+0

你能證實這一點或提供替代方案嗎? – sdasdadas

+0

基本上,MVC不符合標準的「現代」UI概念。你必須站在你的頭上,將設計「分離」成這三種人造類別。你確實希望儘可能保持數據/表示分離,但是當你試圖分離「視圖」和「控制器」時,你必須開始做出無意義的區分。 –

回答

4

首先通常是因爲需要擴展這個類來使用它,所以使用Observable是個壞主意。
無論如何,你所描述的是觀察實體的聚合。
不要使簡單的事情複雜化。讓每個實體都可觀察並讓它處理註冊和通知。你不要來特別包含一個名爲Model的類來聚合一切。打破你的設計。

+0

我可以理解不使用Observable的建議。 (我也發現這個:http://stackoverflow.com/questions/1658702/how-do-i-make-a-class-extend-observable-when-it-has-extended-another-class-too)。但在我看來,我*需要*維護一個人員列表 - 必須有一個包含此列表的對象,並將其保存在視圖或控制器中是不正確的。 – sdasdadas

+2

如果您需要在「Person」屬性更新時收到通知,您應該查看「PropertyChangeListener」,這是MVC設計中的常規方法,例如, 'Swing' http://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html – Cratylus

+0

謝謝,我並不知道PropertyChangeListener。 – sdasdadas

1

您可以隨時讓您的子類delegate包含Observable的實例。實現observer模式的一些其他方式提到here

+1

謝謝 - 我將改變使用Observable。 – sdasdadas

相關問題