組合模式(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控制項,繪圖中的圖形等,這個時候我們就可以採用組合模式來進行管理。組合模式就是將要管理的物件按樹型結構來進行組織,表示成一種 整體 部分 的層次結構,使得使用者對單個...
設計模式之組合模式
組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構。使得使用者對單個物件和組合物件的使用具有一致性。適用性 想表示物件的部分 整體層次結構,希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。典型表示結構圖 宣告組合中的物件宣告介面 在適當的情況下,實現所有類共...