天天看點

疊代器模式群組合模式混用疊代器模式群組合模式混用

  園子裡說設計模式的文章算得上是海量了,是以本篇文章所用到的疊代器設計模式群組合模式不提供原了解析,有興趣的朋友可以到一些前輩的設計模式文章上學學,很多很有意思的。在Head

First

設計模式這本書中,也有說疊代群組合模式混用的方法,但是使用的語言是JAVA,實作起來比起C#差異還是不少。本人在做幾個C#小項目的時候需要用到樹形結構,也看到了Head

設計模式中混用疊代器群組合模式的例子,覺得如果能用C#實作,以後無疑會帶來很大的幫助。下面就記錄下實作過程,希望有不好的地方,各位前輩大力拍,晚生會努力改正,本文使用C#。

  1.能自動周遊樹形結構中的所有節點。

  2.對樹中所有節點進行統一管理,統一到一個根節點上。

  舉個例子:檔案系統,有檔案夾和檔案這兩個類型,形成一個檔案系統樹形結構,使用了本文章所說的混用模式以後,能輕松對每一個結點進行自動處理,最簡單的就是列印各自的名字和子檔案系統或排序等。

  下面以檔案系統為例,可以根據需要靈活改變,主要講得是思想而已。

      1.IFileSystemNode(檔案系統接口):

疊代器模式群組合模式混用疊代器模式群組合模式混用
疊代器模式群組合模式混用疊代器模式群組合模式混用

View Code

      2.FolderNode(檔案夾節點類):

疊代器模式群組合模式混用疊代器模式群組合模式混用
疊代器模式群組合模式混用疊代器模式群組合模式混用

      3.FileNode(檔案節點類):

疊代器模式群組合模式混用疊代器模式群組合模式混用
疊代器模式群組合模式混用疊代器模式群組合模式混用

                 注意:以上實作了組合模式,其中getIterator方法是還沒有代碼的,這個需要使用疊代器模式。

    在FolderNode中有子節點,但是在FileNode中沒有子節點,但是因為使用了組合器模式,對于FolderNode和FileNode,都需要實作相同的契(IFileSystemNode)。是以在FolderNode中傳回的疊代器是用來疊代子節點,而FileNode則不同,它根本沒有子節點,那麼就使用一個叫做空疊代器來滿足契約。

 下面分别實作具體疊代器(繼承C#系統提供的IEnumerator接口)。

    

1.為FolderNode提供具體疊代器:FolderNodeIterator

疊代器模式群組合模式混用疊代器模式群組合模式混用
疊代器模式群組合模式混用疊代器模式群組合模式混用

  建立完類以後,我們修改下FolderNode類中的getIterator方法,傳回一個FolderNodeIterator執行個體,代碼如下:

      2.為FileNode提供具體疊代器:EmptyIterator

疊代器模式群組合模式混用疊代器模式群組合模式混用
疊代器模式群組合模式混用疊代器模式群組合模式混用

View

Code

  建立完類以後,我們同樣修改下FileNode類中的getIterator方法,傳回一個EmptyIterator執行個體,代碼如下:

  

  好像差不多了,我們使用使用一下這個模型:

    為了添加真實性,本示範映射了真實檔案系統,請在Programe類上添加一個靜态方法:Convert

疊代器模式群組合模式混用疊代器模式群組合模式混用
疊代器模式群組合模式混用疊代器模式群組合模式混用

    然後我們在Main方法中就能先映射,再使用,來看一下Main方法,其中使用了疊代器模式去疊代各個子項:

    我映射了桌面上的一個檔案,看看檔案結構:

      

疊代器模式群組合模式混用疊代器模式群組合模式混用

有一個hozin檔案夾(裡面有3首歌),一個L‘theme檔案夾(裡面有一首歌),一個檔案(08開頭的歌)。

    好了,運作程式,看看結果:

疊代器模式群組合模式混用疊代器模式群組合模式混用

,好像有點問題,為什麼隻有一個層的呢?也就是說,為什麼隻疊代了root節點的一層子節點,子節點的子節點還沒有周遊完,這是因為FolderNodeIterator的疊代隻提供了一層疊代,而不會深層疊代。是以如果想要深層疊代,使用Head

First設計模式中的思想就是:提供一個組合疊代器,用來包裝FolderNodeIterator,提供深層疊代功能。下面是我在C#中的實作代碼,添加這樣一個類:CompositeIterator

疊代器模式群組合模式混用疊代器模式群組合模式混用
疊代器模式群組合模式混用疊代器模式群組合模式混用

  然後,修改FolderNode類中的getIterator方法如下:

  包裝完以後,再次運作:

疊代器模式群組合模式混用疊代器模式群組合模式混用

。OK大功告成

    為了适應真實項目,可以改的點有很多:

      1.這裡隻有FolderNode和FileNode,在實際項目中可能不止,可以添加,隻要繼承同一個接口(這裡是IFileSystemNode),那麼就能像皇帝發号指令一樣指令所有子子孫孫做事情了(在root節點上調用IFileSystemNode上聲明有的方法)。

      2.添加契約方法,例如像要對每一個節點進行排序Sort,直接添加一個方法,然後子孫各自實作方法,最後調用root節點的Sort。

      3.這裡的周遊使用前序周遊,周遊樹的所有節點,但是也可以使用您喜歡的方式,隻要修改組合疊代器。