設計模式之組合模式示例

2021-09-29 18:53:10 字數 2475 閱讀 2531

組合模式(composite pattern),就是同一型別的物件像一棵樹一樣聚焦在一起。就像下圖一樣。圖中乙個結點對應乙個類的例項。圖中的箭頭是「組成關係」,即某個結點內部包含了指向的所有結點。

如果翻譯成類圖,就像下圖一樣 。

subcomponent就是上圖中的branch,它包含多個component,也就是說,subcomponent既可以包含subcomponent,又可以包含leaf。

如果看不懂此圖,建議別學了 複習下uml圖怎麼畫 。

component是抽象的。它的存在是為了在subcomponent和leaf之間建立一種聯絡,即讓它們擁有共同的父類。其中的函式是為了subcomponent而設計的。一般預設實現時,丟擲乙個unsupportedoperationexception ,葉子結點不用重寫component的功能。

組合迭代器是對組合模式的進一步優化。顯然,如果我們想要訪問乙個組合模式中的所有元素,只能從根結點遞迴進行。只能一次性全部訪問完,且過程不能停止。如果我們想要像迭代器一樣訪問它們怎麼辦?因此需要在組合模式的基礎上實現乙個迭代器。該迭代器能夠支援對組合模式中所有元素的訪問。

組合迭代器是一種外部迭代(可控),而普通的組合模式是內部迭代(不可控)。

我們借助乙個棧來模擬對樹形結構的遞迴遍歷過程。(具體見**,這裡只是示意)

分支結點返回可正常使用迭代器,而葉子節點返回空的迭代器(nulliteraotor, 空物件模式)。

class

compositeiterator

public..

next()

}

組合模式在很多情況下很有用,例如實現乙個ui框架。

以下**展示了組合模式中的抽象層,即分支結點和葉子結點共同的父類。

public

abstract

class

view

public

void

removechild

(view view)

public iterator iterator()

}

以下**是乙個葉子結點的實現。葉子結點可以有很多種。。。

public

class

textview

extends

view

public

textview

(string name)

}

分支結點的實現,它實現了新增/刪除子結點的操作(addchild、removechild)。

public

class

viewgroup

extends

view

}@override

public

void

removechild

(view view)

@override

public iterator iterator()

}

空的迭代器,看起來像空物件模式(null object pattern),在這個例子中沒啥用。

public

class

nulliterator

implements

iterator

@override

public object next()

}

組合迭代器,看起來像是裝飾器模式(decorator pattern):使用棧模擬遞迴

public

class

compositeiterator

implements

iterator

@override

public

boolean

hasnext()

return

true;}

return

false;}

@override

public object next()

return view;

}return null;

}}

/* 演示示例

* 1. 組合模式

* 2. 空物件模式

* 3. 裝飾器模式

設計模式之組合模式

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

設計模式之 組合模式

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

設計模式之組合模式

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