介面設計模式 之 我的Tree-Client模式

來源:互聯網
上載者:User

介面設計模式 之 我的Tree-Client模式

平時在用C#做介面的時候,尤其是在做參數設定介面的時候,經常會遇到左邊是樹,右邊根據樹節點對應的資料類型顯示不同的內容。VS2003的選項設定介面就是這種布局。那麼我們自己來實現的時候,如何設計才比較好呢?

先看一下我的介面:

這裡我們可以看到有如下幾個我們需要關注的對象:

節點(TreeNode):其中包含了我們最核心的資料,只有根據其中的資料我們才能選擇我們需要的顯示介面
介面容器(Site):我們的各種介面都要最終顯示在這麼小塊顯示地區裡邊。也許進一步分析可能會有更多的東西。
介面(Editor):隨著不同資料的變化而變化。

首先可以確定的是節點中必須要包含我們想要的資料,我們設想的工作情境是這樣的:在運行時,根據節點中資料的類型,我們選擇不同的介面,然後把這些介面加入到介面容器中顯示出來,然後把我們的資料塞到這些介面裡,等我們編輯完了這些資料之後,再把資料放回到節點中去。

在這個工作情境中,介面之間的依賴性要求如下:
1。TreeNode不應該知道具體Editor的類型,因為不同的場合,同一個資料也會有不同種類的編輯方法。
2。Editor眼中只有資料,不會知道TreeNode的存在,因為同一個Editor可能要工作在多種場合之下。
3。Editor也不應該知道 Site 的存在,否則Editor就無法獨立工作,複用性就達不到要求。
4。Site絕對知道Editor的存在,但是也不應該知道 TreeNode 存在,原因同2。
5。TreeNode 不應該知道 Site 的存在。
6。TreeView和MainWindow當然會知道Site的存在了,因為他們就在一個介面裡邊嘛,假裝不知道也太過分了。

這樣一來,我們差不多就可以出一個圖了,如下:

解釋一下,圖上所示的內容其實是讓 TreeView和MainWindow作為粘合劑,把TreeNode、Editor和Site三個類粘合在了一起。這三個類分別通過IEditor和IEditorNotify進行相互之間的通訊。其中各自的職責如下:

TreeNode:通過實現IEditorNotify介面來擷取 Editor 的必要通知,包括Open/Close/Save等。另外實現Data屬性,讓TreeNode和資料的綁定鬆動,以便TreeView和MainWindow的操作。
Editor:通過實現 IEditor 介面來配合 IEditorNotify 的通知工作,讓IEditorNotify的實現者可以擷取必要的資料和編輯資訊。
Site:通過預先定義“資料類型 到 Editor”的映射來實現介面的選擇功能。而且作為Editor的容器,Site自己管理所有的Editor執行個體。只通過一個簡單的SetData來完成 資料、IEditor和IEditorNotify 之間的關聯。
TreeView和MainWindow:兩者配合實現事件和邏輯的粘合,把 TreeNode 包含的資料和IEditorNotify介面傳遞給Site的SetData介面。

從最後的實現代碼來看,代碼的分布非常均勻,至少我自己很滿意。

實際的代碼在這裡下載。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.