2008-11-25 49 views
5

我們正在嵌入式環境中開發,發現我們需要創建自己的UI框架。GUI框架模式?

我以前做過這個,但我有興趣就框架的常用設計模式做一點研究。

的事情,我爲模式的思維類型(有點深遠):

  • 的Widget聚焦/散焦
  • 的Widget動畫
  • 數據元素之間共享
  • 附加命令小部件
  • 保存狀態(MVC?)

對於GUI框架模式,建議閱讀哪些內容?

回答

5

我有兩個給你,回調或通知,也許這就是你所說的「附加命令的小部件」,不知何故,你想對你的UI元素的狀態變化作出反應。需要通知控制器發生了變化。 Cocoa/UIKit有一個叫做「Delegation」的模式和通知來完成這個,其他的使用回調函數或對象(Java Swing)或者「信號和插槽」(QT)。

我非常有用的模式,在野外不常發生的是很容易阻止狀態變化,最簡單的用例就是輸入驗證,想要防止從小部件失去焦點時小部件中的文本與您所期望的不一致。 Windows窗體曾經在一些元素(而不是全部)上擁有這些,Cocoa可以做到這一點。這可以通過在回調函數中使用返回值或參考參數(或指針)來完成,其中被調用者可以與原始小部件進行通信

這些天將樣式應用到UI元素,即更改外觀而不更改功能變得非常受歡迎QT可以做到這一點,我相信很多其他庫

有四個裝飾模式的Gang of有時也用於增強小部件的功能,使可滾動的東西可以通過裝飾。這一切都取決於你需要走多遠你的UI元素。祝你好運,這不是一件容易的事情。

EDT:無論你在哪裏都可以應用MVC。第一批候選人是任何一種列表顯示,不要讓他們負責保留他們正在顯示的項目。這絕對適用於組合框,列表框,表格和樹,您可以將其實現爲文本輸入,但這可能不值得開銷。

3

有些事情,我學會了幫助開發歌星PS3

  • 它有助於保持你的組件邏輯(如何按鈕的作品)和你的視覺邏輯(如何呈現的圖像)分開。當你想出一種全新的渲染方式,並且它可以透明地處理舊的按鈕控件時,這特別好。
  • 設置一種靈活的方式,將應用程序中的數據源綁定到滿是組件的頁面上,因此相同的組件可以顯示一個頁面上的所有歌曲或另一個頁面上的所有照片。這是MVC遭到了歌星
  • 事件調度/事件接收模式(即您訂閱按鈕的點擊)是一個頁面佈局綁定到你的代碼一個非常不錯的方式。如果你不小心,它可能會變成碎片。
  • 不要發明另一種編程語言來描述你的邏輯,你當前的編程語言可能沒問題。
  • 考慮從一個頁面切換到另一個頁面時的步驟。這很大程度上取決於您的內存使用情況,但可能會有兩個頁面加載或沒有加載頁面的時刻。想一想這裏的頁面間通信。
  • 數據驅動您的頁面佈局。允許熱插拔佈局(按一個鍵從PC上重新加載它),因爲你會大量迭代它。
1

研究XAML,尤其是綁定。

微軟在用乾淨的XML語言描述GUI佈局方面做得非常好,如果您使用XAML的簡化版本進行UI描述,您將可以使用他們的工具爲設計師模擬UI。

4

只是幾個經典設計模式的指針;我認爲這些都與GUI構建有關:

  • MVC pattern顯然。
  • Observer pattern;例如,View需要觀察Model(以瞭解其狀態何時更改),Controller需要觀察View(以瞭解何時單擊按鈕)。
  • Strategy pattern;在某種程度上,使用控制器作爲視圖和模型之間的粘合劑正在選擇一種策略。理論上,您應該能夠透明地切換控制器。
  • Composite pattern;您的視圖就像一棵窗格,窗口小部件等等。當你需要調用諸如「view.paint()」之類的東西時,有一個通用接口和迭代這個集合的方法是很有用的。

我知道你問模式爲框架,但你仍然要依靠這些模式,因爲開發人員可能會考慮到這些概念,用你的框架。

你有你的框架要求/具體需求?如果你的目標平臺在內存/ CPU上有限,你可能會想放鬆一些「好原則」。

3

Chain of Command圖案。

例在圖形用戶界面的背景:

interface IWidget 
{ 
    bool HandleEvent(Event event); // returns true if event was handled 
            // or false if event was ignored 
} 

class Button : IWidget 
{ 
    public override bool HandleEvent(Event event) 
    { 
     switch(event.Type) 
     { 
      case EventType.MousePressed: DoStuff(); return true; 
      case EventType.MouseScrolled: return false; 
     } 
    } 
} 

這裏,按鈕不關心滾動事件,所以他們讓他們的父母(在鏈命令)的處理它們。所以,如果你有一個Button在例如一個HTML頁面,用戶在按鈕上滾動,這由父窗口小部件(HTML視圖)處理,整個頁面都會滾動。

對於Qt框架現實世界中使用的例子,請參閱bool QWidget::event(QEvent*)the documentation on event filters

另見:Design Patterns in KDE。 KDE是面向對象的C++庫和軟件的跨平臺開源集合,作爲Linux桌面環境非常流行。這些是來自2003年KDE會議的幻燈片。