2014-09-27 84 views
1

在java swing項目中,我有一個模型類來保存某個JPanel的狀態。我需要將這些數據提供給視圖。 我看到它有兩個選項。有一個擴展Observable的類,並將模型作爲實例變量。請參閱下面的代碼示例。或者讓模型類擴展Observable本身。如果模型類擴展了Observable,或者它應該是類中的一個變量,它擴展了Observable Observable

public class BoardObservable extends Observable { 

private Board board; 

public Board getBoardText() { 
    return board; 
} 

public void setBoardText(Board board) { 
    this.board = board; 
    setChanged(); 
    notifyObservers(board); 
} 
} 

因此,在實現Observer的視圖類中,它將使用Observable參數或Object參數來填充JPanel。

@Override 
public void update(Observable o, Object arg) { 
    if(o instanceof BoardObservable) { 
     this.board = (Board) arg; 
    } 
} 

哪一個是最好的選擇?

回答

1

如上所示,使用額外的類看起來多餘。但是,在實際試圖瞭解您正在嘗試執行的操作時,您看起來像已經支持Model-View-Controller (MVC)設計。

由於該鏈接處理MVC真的很好,我會直接解決你的問題。主要目標是將視圖和交互(控制器)與模型分離,以便您可以將該模型重用到其他用戶界面。

BoardObserver應成爲您的控制器。它也應該是理事會的觀察員,但也直接呼籲理事會的對象。如果影響視圖的模型有任何改變(不僅僅是信息的更新,而且是邏輯狀態 - 如由於程序或數據的狀態而變成禁用的按鈕),控制器應該處理該信息並進行相應的更新到視圖。

使該視圖成爲董事會的觀察員。該視圖應通知控制器任何操作,並且控制器應更新視圖的邏輯狀態(禁用按鈕等)。如果模型中的原始數據發生更改,則可以直接從中更新視圖。

最後,將它們拉在一起。我傾向於將模型傳遞給Controller的構造函數,並讓Controller創建(並...控制)視圖。

Model m = new Model(); 
Controller c = new Controller(m); 
1

你的方法對observer pattern鉸鏈,檢查here。因爲ObservableObserver是互補的,所以你需要兩者。通常情況下,如果需要,型號可以擴展Observable,如BoardObservable所示,但型號可以delegate至包含Observable。相反,該視圖只需實現Observer接口;此example委託更新嵌套ModelObserver

實現觀察者模式的替代方法被引用爲here。請參閱Swing控制器上的此answer

相關問題