設計模式之組合模式

2021-08-20 21:39:26 字數 2987 閱讀 5366

一情景

最近電腦d盤裡面的東西都滿了 ,需要整理一下,該清除的要清除掉,該留的要留著,所以對於d盤裡面的目錄和檔案要一層層的整理,我們清理的前提是不刪除檔案目錄的前提下,先來看根目錄d盤,根目錄如下

d盤資料夾

根目錄下有兩個檔案data.csv和wine.data.csv,還有兩個資料夾tmp和ssi,tmp下有乙個檔案影象.bmp

ssi檔案下面有兩個檔案工作表.xlsx和日程.xlsx

如果按照正常的步驟我們要先遍歷d盤,在d盤下的兩個檔案data.csv和wine.data.csv,因為這兩個檔案不是檔案不是目錄可以直接刪除,還有兩個資料夾目錄tmp和ssi。對於這兩個資料夾目錄,我們只能再分別對它們進行遍歷,如果發現他們兩個檔案目錄下面還有檔案直接刪除,如果還有資料夾目錄接著在分別遍歷,一直重複上面的動作,知道最底層不存在資料夾目錄。像這樣假設d盤下有很多資料夾目錄,這些資料夾目錄下面還有檔案目錄,或許有的資料夾目錄層次很深,如果手動去幹的話,估計要瘋掉吧!那麼我們只能另想他法了!翻看gof,有一種模式能幫我解決這個問題,這個模式叫做組合模式。

二組合模式

組合模式:將物件組合成樹形結構以表示部分-整體的層次結構,組合模式使得單個物件和組合物件具有一致性。

看上面的例子乙個d盤裡面包含了兩個檔案data.csv和wine.data.csv還有兩個資料夾ssi和tmp,我們可以這麼理解把這四個檔案組合成d盤的結構,而ssi 和d盤下面還有其他的幾個檔案,他們分別組合成ssi和tmp的資料夾結構。這種資料結構看起來就像樹一樣,d盤就像樹的主幹,data.csv和wine.data.csv像主幹的樹葉,ssi和tmp像主幹的樹枝,組合成si和tmp的檔案就像ssi和tmp的樹葉。而組合模式處理的思想是這樣的:可以把檔案看成是基本的元素物件,把資料夾目錄看成複雜的物件,基本的物件組合成複雜的物件,複雜的物件還可以組合成更複雜的物件,這樣一層層的遞迴。這樣使用者在任何使用基本物件的時候都可以使用複雜物件,使用者在根本不用考慮處理的是葉子節點還是樹枝節點。簡單點就是說使用者可以一致的對待使用簡單物件和組合物件。

d盤就像樹主幹,data.csv,wine.data.csv、是d盤的葉子,影象.bmp是tmp的葉子,工作表.xlsx、日程.xlsx是ssi的葉子,因為它們下面沒有分支,把ssi和tmp是主幹d盤的分枝,因為它們下面有分支。用**來實現

首先得有乙個抽象類來管理這些樹枝和樹葉

public     abstract   class component

public abstract  void add(component composite);//通常宣告add 來新增樹葉和樹枝

public abstract  void remove(component composite);;//通常宣告remove 來移除樹葉和樹枝

public abstract  void clear();//不管是葉子和樹枝都有清理的功能,樹枝的清理功能就是清理這個樹枝下面分支的功能

}定義乙個樹枝,樹枝肯定很多分支儲存樹葉或者是分支樹枝

public   class composite extends component

public void add(component composite)

public void remove(component composite)

public void clear() }}

葉子節點,葉子其實就乙個清理的功能,但是為了抽象我們也讓他擁有和父類一樣的增加add和remove方法,但是實際沒啥意義

public   class leaf extends component

public void add(component composite)

public void remove(component composite)

public void clear()

}客戶端做清理工作

component d=new composite("d盤");//主幹目錄

component tmp= new composite("tmp") ;//主幹目錄下分的樹枝節點

component ssi= new composite("ssi") ;

component l1= new leaf("data.csv") ;//主幹錄下分的樹葉節點

component l2= new leaf("wine.data.csv") ;

component l3= new leaf("影象.bmp") ;

component l4= new leaf("工作表.xlsx") ;

component l5= new leaf("日程.xlsx") ;

d.add(l1);//主幹目錄下的葉子檔案

d.add(l2);//主幹目錄下的葉子檔案

tmp.add(l3);//樹枝tmp下的樹葉節點

d.add(tmp);//樹枝tmp屬於主幹目錄

ssi.add(l4);//樹枝ssi下的樹葉節點

ssi.add(l5);//樹枝ssi下的樹葉節點

d.add(ssi);//樹枝ssi屬於主幹目錄

d.clear();//同意處理,處理的時候不要考慮是不是葉子還是樹枝

看完**,還有很重要的一點理解就是,組合模式可以讓客戶一致的對待單個物件和組合物件。看客戶端**,如果你覺得這棵樹只有葉子,你就只需要定義葉子類類,當然如果你覺得這可樹有很多分支類,分支類下還有很多分支類。那你就定義基本樹枝類,用樹枝類組合成複雜的樹枝類。在客戶端發現不管是定義樹枝還是樹葉他們的方式和行為都基本一樣。這是我對組合模式的理解!

設計模式之組合模式

組合模式 以 整體 部分 的層次結構,將物件以樹型結構組合起來。如下圖所示 組合模式首先得定義乙個用來管理和訪問部件們的抽象類。public abstract class equipment 再建立乙個組合體的部件 class element equipment 現在我們再來定義乙個組合體,也就是組...

設計模式之 組合模式

有時候我們需要維護一些物件,這些物件具有一定的層次結構,它們之間雖然差異很大,但在使用的時候我們希望能構一致的對待,比如windows控制項,繪圖中的圖形等,這個時候我們就可以採用組合模式來進行管理。組合模式就是將要管理的物件按樹型結構來進行組織,表示成一種 整體 部分 的層次結構,使得使用者對單個...

設計模式之組合模式

組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構。使得使用者對單個物件和組合物件的使用具有一致性。適用性 想表示物件的部分 整體層次結構,希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。典型表示結構圖 宣告組合中的物件宣告介面 在適當的情況下,實現所有類共...