2011-04-14 32 views
1

想象一下,我有一個抽象的「FriendEvent」模型,它有幾個不同的具體實現,即。 FriendPosted,FriendCommented,FriendUploadedPhoto等。它們都應該以我對FriendEvents的視圖呈現,但應該在視覺上彼此不同(例如,FriendUploadPhoto應包含縮略圖)。多態視圖模式

什麼是良好的面向對象的模式來實現這一目標?

我有興趣瞭解是否有替代方法在視圖代碼中打開模型的具體類。這種感覺不對,因爲它使用條件邏輯,我認爲它應該可以依賴於多態,但我很難想出一個更好的主意。有沒有建立模式來解決這個問題?

(我顯然不希望實現模型視圖邏輯,因爲這將被混合的責任,因爲我可能要爲每個型號不同的看法)

澄清:如何在模型層中建模不同的事件類型不是問題。有幾種衆所周知的面向對象解決方案。問題涉及視圖代碼,它負責直觀地呈現模型。我想我有一個EventView類來處理顯示事件(模型)。問題是:如何實現這個類沒有切換塊,根據事件的具體類型選擇不同的代碼路徑是渲染。

+1

聽起來像你只想使用繼承。有一個具有所有常用屬性的基類,然後讓您的具體實現從您的基類繼承。 – 2011-04-14 12:12:58

+0

@Evan顯然我在模型層使用繼承來實現多態。問題涉及視圖代碼。 – KaptajnKold 2011-04-14 12:27:30

+0

任務陳述太少。班級的責任和合作者是什麼?在最簡單的情況下,它可能是帶有對EventType類的引用的單個Event類的實例。 – 2011-04-14 13:01:56

回答

1

好像你有一些DoubleDispatch關注點在這裏。

如果我正確理解你,你試圖避免混合模型和視圖。每個事件類可以有

HtmlString getHtmlView() { /* code */ } 

但隨後事件有鑑於知識和我們每添加一個新的觀點,我們添加一個新的getXXXView()方法時。我同意這看起來不愉快。

因此,我們可以通過具有提高分離關注的所有事件提供

HtmlViewMaker getHtmlMaker { return new MyKindOfViwer(this); } 

至少現在我們已經得到了查看代碼伸到自己的類。是的,我們可能需要爲每種/多種事件編寫特殊的案例代碼,但這是不可避免的。我們的第一個問題是在哪裏放置這些特殊代碼 - 並且我們已經得到了答案。

但是我們仍然有一個問題:每種新的視圖都需要一個新的getXxxMaker方法。所以我們開始考慮更復雜的工廠以及泛型和模板的使用等等。

0

對我來說,我只是使用局部視圖的概念。基類由主視圖處理,而主視圖需要一個局部視圖來處理顯示具體類的需要。

+0

知道需要哪個局部視圖? – KaptajnKold 2011-04-14 13:26:55

+0

您翻轉它以便「具體視圖」是主要視圖,它們都需要「基本視圖」。 – cdeszaq 2011-04-14 15:08:54