2012-08-23 73 views
1

我有一個名爲「層次結構」的對象,基本上只是一個字符串列表,例如。 [1 2 3 4]。我也有一些叫做FormattedHierarchies的對象,它們應該總是以用戶希望表示的方式保留層次結構的格式化版本,例如, (1-4)或{1,2,3,4}。檢查對象是否發生了變化(保留良好的類設計)

我的問題是這樣的:

我要立即更新FormattedHierarchy當層次已更改(例如,如果從[1 2 3 4]層次結構的變化[1 2 3] FormattedHierarchy應該從改變(1-4)至(1-3))。

谷歌搜索變成了http://docs.oracle.com/javase/tutorial/uiswing/events/changelistener.html 但我的問題是這樣的:如果我想有層次實現的ChangeListener,它必須實現方法「stateChanged」。

類型層次結構必須實現繼承的抽象方法 ChangeListener.stateChanged(的ChangeEvent)

具有層次創建一個新的FormattedHierarchy是不可行的,我也認爲這不是善類設計。這是因爲層次結構會執行處理其格式的內容(儘管以間接方式)。

是否有任何標準或聰明的解決方案來解決這個問題?

+0

爲什麼不只是使用一個標誌(例如'isModified')? – user1329572

+0

正如我希望更改自動更新,我寧願有一個isChanged-方法,無論何時在層次結構上使用setter時都會調用該方法。它可能具有我不知道或無法預見的含義無論何時使用setter,setter調用isChanged方法是否有任何缺點? –

回答

1

我會盡量避免需要保持兩個對象完全同步。我可以建議你三種方式:

  1. 有無不管是誰調用Hierarchy二傳手呼叫也refresh()方法上FormattedHierarchy。如果你從一個或幾個地方調用setter,這很容易。
  2. 僅根據需要重新計算Hierarchy的字符串表示形式,而不進行存儲。您需要存儲格式,而不是實際的格式化結果。
  3. 已有Hierarchy保留版本數,每增加一次,它都會增加。 FormattedHierarchy保存格式化的字符串以及它看到的最後一個版本計數。當您詢問字符串FormattedHierarchy時,它首先檢查版本計數是否已更改,如果情況確實如此,則觸發重新格式化字符串的重新計算。
+0

欣賞答案 - 所有的方法都可能有助於其他人查找相關問題。如果有人提供了列表的補充,請評論。編輯:兩個對象完全同步有什麼問題? –

+0

我不確定這是不好的,但根據我的經驗,這是一個痛苦。如果你開始需要它,這對於多線程來說確實很糟糕。 – Flavio

0

難道你不能簡單地合併Hierarchy類與FormattedHierarchy,如果需要使用兩個不同的接口爲您的不同的消費者?

通過這種方式,你只需要創建類的具體制定者當一組完成,將修改兩個字符串[1 2 3 4](1-4)[1 2 3](1-3)

+0

這有其優點,因爲我只需要一個引用者,但我並不太熱衷於合併數據和表示。 –

相關問題