C 設計模式(八)組合模式

2021-06-28 16:55:53 字數 2477 閱讀 3377

在軟體開發過程中,我們經常會遇到處理簡單物件和復合物件的情況,例如對作業系統中目錄的處理就是這樣的乙個例子,因為目錄可以包括單獨的檔案,也可以包括資料夾,資料夾又是由檔案組成的,由於簡單物件和復合物件在功能上區別,導致在操作過程中必須區分簡單物件和復合物件,這樣就會導致客戶呼叫帶來不必要的麻煩,然而作為客戶,它們希望能夠始終一致地對待簡單物件和復合物件。然而組合模式就是解決這樣的問題。下面讓我們看看組合模式是怎樣解決這個問題的。

組合模式允許你將物件組合成樹形結構來表現」部分-整體「的層次結構,使得客戶以一致的方式處理單個物件以及物件的組合。下面我們用繪製的例子來詳細介紹組合模式,圖形可以由一些基本圖形元素組成(如直線,圓等),也可以由一些複雜圖形組成(由基本圖形元素組合而成),為了使客戶對基本圖形和複雜圖形的呼叫保持一致,我們使用組合模式來達到整個目的。

組合模式實現的最關鍵的地方是——簡單物件和復合物件必須實現相同的介面。這就是組合模式能夠將組合物件和簡單物件進行一致處理的原因。

介紹完組合模式的定義之後,讓我們以圖形的例子來實現組合模式,具體**如下:

class program

/// /// 圖形抽象類,

///

public abstract class graphics

public graphics(string name)

public abstract void draw();

public abstract void add(graphics g);

public abstract void remove(graphics g);

}/// /// 簡單圖形類——線

///

public class line : graphics

public override void draw()

public override void remove(graphics g)

public override void add(graphics g)

}/// /// 複雜圖形,由一些簡單圖形組成

///

public class complexgraphic : graphics

public override void add(graphics g)

public override void remove(graphics g)

public override void draw()}}

}

由於基本圖形物件不存在add和remove方法,上面實現中直接通過丟擲乙個異常的方式來解決這樣的問題的,但是我們想以一種更安全的方式來解決——因為基本圖形根本不存在這樣的方法,我們是不是可以移除這些方法呢?為了移除這些方法,我們就不得不修改graphics介面,我們把管理子物件的方法宣告放在復合圖形物件裡面,這樣簡單物件line、circle使用這些方法時在編譯時就會出錯,這樣的一種實現方式我們稱為安全式的組合模式,然而上面的實現方式稱為透明式的組合模式,下面讓我們看看安全式的組合模式又是怎樣實現的,具體實現**如下:

class program

/// /// 圖形抽象類,

///

public abstract class graphics

public graphics(string name)

public abstract void draw();

// 移除了add和remove方法

// 把管理子物件的方法放到了complexgraphics類中進行管理

// 因為這些方法只在複雜圖形中才有意義

}/// /// 簡單圖形類——線

///

public class line : graphics

// 重寫父類抽象方法

public override void draw()

}/// /// 簡單圖形類——圓

///

public class circle : graphics

// 重寫父類抽象方法

public override void draw()

}/// /// 複雜圖形,由一些簡單圖形組成,這裡假設該複雜圖形由乙個圓兩條線組成的複雜圖形

///

public class complexgraphics : graphics

/// /// 複雜圖形的畫法

///

public override void draw()

}public void add(graphics g)

public void remove(graphics g)

}

優點:

組合模式使得客戶端**可以一致地處理物件和物件容器,無需關係處理的單個物件,還是組合的物件容器。

將」客戶**與複雜的物件容器結構「解耦。

可以更容易地往組合物件中加入新的構件。

缺點:使得設計更加複雜。客戶端需要花更多時間理清類之間的層次關係。(這個是幾乎所有設計模式所面臨的問題)。

我與C 設計模式(八) 組合模式

組合模式,是為了解決整體和部分一直對待的問題而產生的,要求整體和部分有很多一致的操作。部分和整體繼承同乙個抽象幾口,這樣,外部使用時是一致的,同乙個方法能遍歷整體也能訪問部分。g o composite main.cpp composite.cpp結果 operation from leaf ope...

設計模式8 組合模式

組合模式首先想到的就是樹形結構,比如我們常用的檔案結構,請看windows的檔案結構 無論是檔案或者是資料夾,常用操作都是一致的,比如 複製 貼上 剪下 刪除 所佔空間大小。我們並沒有刻意的去分他是資料夾還是檔案。我們可以把資料夾看成是組合物件,把每乙個檔案看成是單個物件。組合模式模糊了這兩個概念,...

《設計模式12 組合模式

組合模式其實是乙個很形象的模式。它也被稱為部分整體模式。組合模式的結構就如同樹狀圖一樣。而樹就是枝幹 葉子的組合,組合模式可以形象的這麼理解。其實資料夾是乙個很好的組合模式的體現。乙個資料夾 樹根root 下可能有多個資料夾 枝幹trunk 可能是單個的檔案 樹葉leaf 而枝幹是可以繼續向下延伸的...