2009-01-12 64 views
1

我有一組非GUI對象,它們與GUI對象具有一對一的關係。 所有事件都通過頂層窗口進行路由。將非GUI對象連接到GUI對象

在GUI對象上發生的許多(並非全部)事件導致調用關聯對象上的方法。

NonGui對象中的某些方法在調用GUI對象時被調用。

一個例子就是像現代圖形用戶界面的Rogue遊戲。 您有一個玩家在一個回合中佔據的區域(稱之爲區域) ,並且您在GUI上擁有與其關聯的對象(一個按鈕)。 請記住它只是一個比喻(甚至不是真正的問題),沒有比喻是完美的。

問題是,人們是如何設計這種事情的?

由於按鈕類來自第三方庫,我不能在其中嵌入對nonGUI對象的引用,儘管我可以嵌入對nonGUI對象中的GUI對象的引用。所以它看起來像我將不得不創建一個地圖從一個按鈕到某個地方的「地區」,但我在哪裏放?在頂層窗口中?在頂級模型中? IU是否剝離某種接口類?

對此提出建議?

+0

您在引用「連接」中查找的術語被稱爲數據綁定。 – 2009-01-12 22:46:15

回答

3

如果你提到你的平臺和語言,它會有所幫助,但通常聽起來像你描述的是Model-View-Controller

您的「GUI」對象是視圖。這是您保存用戶界面所有渲染邏輯的地方。用戶與View的交互由Controller處理。

控制器是一個薄薄的事件句柄。用戶交互在Controller上調用方法,然後將它們路由到Model。

您的「非GUI」對象是模型。這是包含業務邏輯的對象,其狀態最終通過單擊GUI上的按鈕進行更新。

您提到對象之間的「嵌入」引用。只要您的GUI中的事件可以通過某種機制路由到您的Controller,這不是必需的。這種設計模式很有用,因爲它將您的UI邏輯與業務邏輯分開。您可以非常容易地「捕捉」新視圖,因爲視圖和控制器之間的事件接線很少。

維基百科article有更多信息和鏈接到實施例子。

0

浪費一點時間看Falcon's Eye(雖然它是Nethack而不是Rogue)。遊戲有着悠久的皮膚遊戲歷史(或者一般的命令行應用程序),它不是非常經典的mvc - 它已經有了完整的UI,而是通過直接翻譯向該UI添加裝飾器,或者另一個隱喻(如gparted,gnome分區編輯器,它允許通過直接操作構建一系列分區編輯命令)