什么是組合模式
將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),Composite 使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性锦爵,用戶可以統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。(注:擇自設(shè)計(jì)模式的黑書)
最簡(jiǎn)單的最常用的例子就是 UIView 了限寞,典型的樹形結(jié)構(gòu)臼疫。
標(biāo)準(zhǔn)組成
- Component:組合中的抽象接口
- Composite:子結(jié)點(diǎn)
- Leaf:子結(jié)點(diǎn)
結(jié)構(gòu)
這里直接以樹為例:
實(shí)現(xiàn)
Component:
import UIKit
@objc protocol TreeProtocol {
var trees: Array<TreeProtocol> {get}
func doSomething()
@objc optional func addChild(child: TreeProtocol)
@objc optional func removeChild(child: TreeProtocol)
@objc optional func getChildren(index: Int) -> TreeProtocol
@objc optional func clear()
}
Composite:
import UIKit
class Tree: TreeProtocol {
var trees: Array<TreeProtocol>
init() {
self.trees = Array<TreeProtocol>()
}
func doSomething() {
}
func addChild(child: TreeProtocol) {
self.trees.append(child)
}
func removeChild(child: TreeProtocol) {
}
func getChildren(index: Int) -> TreeProtocol {
return self.trees[index]
}
func clear() {
self.trees.removeAll()
}
}
Leaf:
import UIKit
class Leaf: TreeProtocol {
var trees: Array<TreeProtocol>
init() {
self.trees = Array<TreeProtocol>()
}
func doSomething() {
}
}
Composite,Leaf 指一類結(jié)點(diǎn)胡桨,并不是唯一官帘,其中 Leaf 是無子結(jié)點(diǎn),也可以說是 Composite 的一種特殊情況昧谊。結(jié)合 UIView 的代碼刽虹,再看上面代碼,應(yīng)該可以進(jìn)一步加深理解組合模式呢诬。
小結(jié)
比較容易理解的一種設(shè)計(jì)模式涌哲,總之,最關(guān)鍵的就是一句話:使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性尚镰。