2010-02-24 55 views
8

我正在尋找一篇文章或教程,其中給出了一個最新的MVC模式(2.0?)與Swing框架應該是什麼樣子的示例。此外,更習慣於分層架構,我想知道域對象或POJO如何適合圖片。我是否認爲他們是分開的,並被模型調用?至於模式本身,在將類分組到包中方面是否有廣泛使用的約定?最新的Swing MVC示例+問題

TIA,

詹姆斯P.

回答

26

這是一個很大的問題。我會和你分享一些關於這個主題的想法,並看看它出了什麼問題。

擺動更多模型 - >查看比模型 - >查看 - >控制器。模型 - >視圖的問題在於,Swing應用程序通常是一個View對象的子類,並且該對象變成視圖和該視圖的控制器。在大型應用程序中加班會導致很多問題和意大利麪代碼。

我幾年來一直在做的事情是創建一個單獨的對象,稱爲Controller,它不擴展任何UI類。在這方面這是一個普通的舊對象。該控制器將負責爲View實例化頂級組件,將監聽器連接到視圖以響應用戶,並轉向並調用模型以完成工作。

視圖將子類Swing。視圖負責響應鼠標事件,鍵盤事件等。視圖中處理任何類型的Swing特定事件。它還將提供高級方法來更新控制器將用於回調更新UI的視圖。經典的擺動模型也是View的一部分,因爲您選擇的組件與您將使用的模型非常相關。 View也負責向Controller發送高級事件,Controller負責響應這些高級事件。這些事件可能是UserEvent.ADD,UserEvent.EDIT,AuthenticationEvent.LOG_IN,AuthenticationEvent.LOG_OUT等。這些事件是應用程序事件,更像產品經理可能識別的內容。 Controller沒有響應Mouse,ChangListener等。我實際上爲這些構建了我自己的EventDispatch和Event框架,因爲Swing的擴展和使用非常困難。該視圖的作品是這樣的:

public void mouseClicked(MouseEvent evt) { 
    User u = getUserAt(evt.getPoint()); 
    dispatch(new UserEvent(UserEvent.EDIT, u)); 
} 

在我的控制器中,我有簡單的方法連接到這些事件。這裏可能是一個示例:

@EventCallback(command = "exit") 
public void exit(AppEvent evt) { 
    onExit(); 
} 

@EventCallback(command = "help.about") 
public void showAbout(AppEvent evt) { 
    audioFinderFrame.showAboutDialog(engine.getLicenseInfo()); 
} 

@EventCallback(command = MediaSourceEvent.START_REFRESH) 
public void refreshStarted(final MediaSourceEvent event) { 
    if(frame != null) frame.refreshMediaSource(event.getSource(), true); 
} 

的註解是擴展我必須迅速添加事件偵聽器方法到EventDisptach源。但是,重點在於控制器上的每個方法都是使用高級事件從視圖中調用的。這使控制器與視圖的顯示方式有點隔離。 Controller的登錄方法不必擔心構成視圖的組件。他只是收到一個事件並執行工作。控制器負責應用程序的流程。

由於事件系統與Swing分離,我在模型層重複使用它,因此模型可以將事件分派回Controller,Controller可以將這些更改轉發給UI。

該模型和Controller是POJO。他們理解事件,但就是這樣。該模型是應用程序的邏輯,包括DAO級別,可能執行後臺任務的服務,與服務器對話的任何服務層以及大多數人可能會說的DTO對象。我沒有規定DTO應該是簡單的getter/setter結構的概念。我確實允許在那裏有一些邏輯,因爲它們是在所有圖層之間浮動的東西。因爲每個層都可以訪問它們,所以它們提供了一個集中每個層可以重複使用的邏輯的好地方。 View,Controller和Model可以訪問這些方法,所以爲什麼不把它們放在它們之間移動的對象中。

通常,此邏輯更接近業務邏輯或模型維護邏輯。我很小心將更大的體系結構耦合到這些方法。這些方法不會與數據庫交談,也不會調用服務器端方法,因此它們不會將引用返回到較大的體系結構部分。它們具有DTO的所有優點:輕便,易構造,低依賴性,但仍保持面向對象設計的原則:封裝,重用和信息隱藏。

我也已經開始使用Spring來連接模型的各個部分以及控制器對模型的依賴關係和依賴關係。我發現這個模型運行得非常好,比不使用它更令人愉快。使用Spring JDBC模板和JMS模板(如果使用這些技術)也很好。但是,它是可選的。

我永遠不會重用控制器。控制器是你係統中最具體的東西,而通用只會使它們更難維護。普遍性屬於視圖和模型,因爲它使開發更容易。所以設計模式往往會發現自己在這些方面,但很少在控制器中。控制器是來回的簡單方法調用。

我發現這樣做使得構建Swing UI更容易,更直接。我不太可能通過一次收聽和操縱兩個控件來進入無限的事件循環。我還發現測試和打破系統是比較容易的,因爲我的大部分邏輯都是在Swing的掌握之外存在的。這使得功能測試成爲可能,沒有一個巨大的工具包試圖模擬鼠標點擊等。

這裏沒有很多代碼來說明抱歉,但希望這有助於。