2010-02-17 86 views
0

我對GUI設計很陌生,並且正在努力一點,以決定我的繼承意圖是否可以接受(我熟悉偏愛構圖的一般概念)。Java GUI設計 - 「浪費」的繼承?

例如,如果我有一個圖形用戶界面,將有3個JToolBars(在頂部兩個工具欄和在底部的狀態條),爲我看到它我有2種明顯選擇:

  • 只需實例3 JToolBars,向它們添加各種組件(按鈕等),然後將它們添加到父面板。做所有這些的代碼可能在父面板中(即一些私有方法)。
  • 創建3個新類 - UpperToolBar,LowerToolBar,StatusBar。每個子類都包含JToolBar的子類,幷包含必要的代碼以「構建自己」(可能在每種情況下從構造函數調用的私有方法中)。

我的直接首選是第二個選項,只是在封裝,模塊化等方面。然而,它似乎是錯誤的子類JToolBar但實際上並沒有添加任何功能?這是可以接受的還是有更好的選擇。

回答

2

也許你想要一個工廠的第三種方法來獲得一個UpperToolBar爲你實例化和配置一個JToolBar

最初,您可以在要使用JToolBars的類中使用簡單工廠方法,並調用這些方法將它們配置爲spec(與選項1類似)。

隨着項目的成長,要重用UpperToolBarLowerToolBarStatusBar情況下,你正在創建你的初始面板上,你可以重構工具欄創建了一個工廠類(可以是靜態或具體工廠因關於是否有任何配置可能與工廠創建的類型相同)。你的GUI類將各自能夠利用同樣只具備UpperToolBar實例。

public class ToolBarFactory { 
    public static JToolBar getUpperToolBar() { 
    //create and configure a JToolBar to be used as an upper tool bar 
    } 

    public static JToolBar getLowerToolBar() { 
    //create and configure a JToolBar to be used as a lower tool bar 
    } 

    public static JToolBar getStatusToolBar() { 
    //create and configure a JToolBar to be used as a status tool bar 
    } 
} 

一旦要開始定製許多不同類型的GUI組件具有變體的情況下,你可以組織一組工廠類的它們的配置。 例如ToolBarFactory,MenuFactory,ButtonFactory等,這將有助於打破了施工規範,而不是隻在一個地方有它。

+0

看起來很合理,但如果有很多GUI組件,這又意味着將所有代碼構建爲一個類,而不是很好地分解。 – William 2010-02-17 17:57:52

+1

至少剛開始時,可​​以只是靜態創建方法而不是任何花哨模式。實際上,構造函數是一種靜態方法(技術上,構造函數在字節碼中表現爲有趣的實例方法,因爲在調用構造函數之前需要分配對象,構造函數在沒有「靜態地知道」運行時類型的情況下互相調用)。 – 2010-02-17 18:29:14

0

聽起來像在第二個選項中,你正在創建一個你真正想要一個實例的類。特別是,我會說,如果一個類如UpperToolBar自定義代碼是永遠只適用於JToolBar的這一個特定實例,再有就是在創造一個新的類沒有意義的。另一方面,如果你打算以不同的形式多次實例化UpperToolBar,那麼有一個類可能是適當的(例如,你不需要繼續重寫特定於UpperToolBar的代碼)。

+0

我同意你所說的話,所以我的不安。然而,我已經在創建工具欄的類中給出了替代方案,其中包含大量代碼以構建它們,這似乎也是錯誤的。 – William 2010-02-17 17:47:04

+0

如果所有代碼都在方法中(例如'buildUpperToolBar'),那麼我認爲它沒有問題。 – danben 2010-02-17 18:26:01

1

如果您關注的是通過選擇選項1你正在寫很多的樣板代碼工具欄創建,那麼你可以考慮使用「工廠法」模式用於創建工具欄的。在的情況有些什麼類似於你我使用了我發現有用的文章GoF Factory Method in writing GUIs中概述的方法。

0

假設在你使用工具欄的時候會有一些常見的設計元素(例如它們總是有邊框,或者總是有背景圖像,或者其他的東西),爲JToolBar提供一個工廠類可能是有意義的。它將具有通用代碼,以及構建左上欄,右上欄和底欄的特定方法。

然後,這將是一個模式,你可以遵循你想要重用的其他UI元素。滾動條的工廠類,另一個用於文本框。這樣,您就可以爲任何特定的UI元素存儲通用代碼,並可以放置特定方法爲特定上下文創建特定元素。如果你發現文本框和工具欄有一些共同點,你可以給它們一個封裝共享的公共基類。