2015-02-10 193 views
2

我的問題

會是什麼好辦法的通知「頂級」模式(即代表整個應用程序之一,但不知道的每一個細節「的孩子未保存的更改「它的模型是由什麼組成的),每當任何」孩子「模型發生了什麼小的變化?跟蹤在Java Swing應用程序

語境問題

我棟中等Java Swing應用程序。粗略地說,它「模擬」一個計算,允許調整輸入和參數。它實時更新計算結果和中間步驟。這使得人們可以分析輸入變化如何反映整體。

應用程序可以使用文件系統保存和加載此「計算」。我想知道如何跟蹤如果應用程序的「模式」有什麼未保存變化,使我可以:

  1. 提示要關閉如果存在
  2. 直接關閉,如果沒有未保存的更改目前
  3. 尚未保存的更改之前保存
  4. 提示新的文件被打開時保存(在設計上,只能有1個打開文件)

我已經建立了這個應用之後的MVC架構。這意味着我的每個視圖(Swing)元素在相應的模型對象發生變化時都會收到通知(通過Observer.update()),因此視圖元素會有選擇地更新,而不必渲染所有視圖以進行微小的更改影響一切。

視圖和模型是分層構建的,因此模型包含其他模型並且視圖包含其他視圖。 「父」視圖通過向他們分配他們從他們自己的「父」模型獲得的「孩子」模型來創建他們的「孩子」視圖。

我認爲什麼次優解,爲什麼

具有主視圖observe每一點模型

我沒有什麼主視圖作爲監聽器/觀察者添加到每一個模型應用程序,因爲實際上有很多模型對象,並且主視圖會因此獲得令人難以置信的高噪聲與信號比率(模型執行的計算有很多步驟,每個步驟都觸發一次更新,而我只需要知道事情已經改變了一次,而不是每一次)。

在每一個小模型有到主模型的引用通知它的變化

我不希望每一個模型對象具有對主模型的引用,因爲這對我來說似乎是反對基本的軟件設計原則。

每個模型都有父引用。如有更改,通知家長

如果孩子發生變化,則通知其父母;這會傳播直到「主」模型對象得到通知,它可以改變它的狀態以反映未保存的變化。當它保存時,它將設置這個標誌。 似乎是一個準理想的解決方案,只是我不喜歡每個孩子模型都需要對其父模型的引用這一事實 - 如果我這樣做,組合的語義或「有一個」 - 關係似乎向後彎曲這個。

+0

不完全瞭解你的代碼是如何建立的,但是你認爲每個小模型都是需要改變的狀態的觀察者,其中最初註冊的觀察者是從主要最頂級父模型開始逐步降低建設鏈的?另外,我正在閱讀你的問題的方式是模型由其他模型(樹下的小模型)組成,就像層次結構不知何故,層次結構也可能以圖形方式在視覺上表示。 – NESPowerGlove 2015-02-10 21:50:04

+0

@NESPowerGlove你的層次部分*完全正確。模型組成的模型;由視圖組成的視圖。 – MHaaZ 2015-02-10 22:29:53

+0

@trashgod對不起,但由於我不知道API的心臟,它不是很明顯*如何*或*爲什麼用*來使用您的建議。請你詳細說明一下嗎? – MHaaZ 2015-02-10 22:52:29

回答

1

您至少有兩種選擇

你可以...

有父模型檢查每個子模型(每個子模型檢查是兒童)和尋找任何(或第一)模型已經改變了

如果你只想知道某個給定時刻的狀態(就像退出應用程序之前那樣),這很好。這是比較便宜的,你可以控制何時進行手工檢查和維護回調和處理事件通知

你可以不佔用大量的額外資源...

讓每個子模型的觸發事件發生變化時,父模型(位於頂部)可用於跟蹤更改。

讓每個孩子模型觸發一個事件是好的,如果你想保持對模型的實時觀察,但它是一些昂貴的東西,因爲每個模型可能被多個觀察者觀察到,所以通知它們中的每一個可能是昂貴的。您還需要鏈接事件,因此,底部的子模型會通知它的父級,這會通知它的父級,等等等等,直到它到達頂級父級模型...