組合模式定義
將對象組合成樹形結構以表示“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性
組合模式使用場景
場景一:表示對象的部分-整體結構時
場景二:從一個整體中能夠獨立出部分模塊或功能的場景
組合模式-角色劃分
角色一:抽象根節(jié)點(Component)
角色二:具體子節(jié)點(Composite)
角色三:葉子節(jié)點(太監(jiān)節(jié)點->沒有兒子)(Leaf)
(iOS開發(fā)中,UIView以及其子控件的使用)
組合模式UML圖
案例
組合模式UIView的使用.png

組合模式UIView的使用.png

組合模式案例.png
角色一:抽象根節(jié)點(Component)
protocol DirProtocol {
//特點一:節(jié)點名字
var name:String{get}
//特點二:子節(jié)點(數(shù)組)
var dirs:Array<DirProtocol>{get}
//特點三:業(yè)務邏輯
func doSomthing()
func addChild(child:DirProtocol)
func removeChild(child:DirProtocol)
func getChild(index:Int) -> DirProtocol
func clear()
}
角色二:具體子節(jié)點(Composite)
class Folder: DirProtocol {
var name: String
var dirs:Array<DirProtocol>
init(name:String) {
self.name = name
self.dirs = Array<DirProtocol>()
}
func doSomthing() {
print("節(jié)點名稱:\(self.name)")
}
//添加
func addChild(child:DirProtocol) {
self.dirs.append(child)
}
//刪除
func removeChild(child:DirProtocol){
for index in 0...self.dirs.count - 1 {
if self.dirs[index].name == child.name {
self.dirs.remove(at: index)
break
}
}
}
//得到
func getChild(index:Int) -> DirProtocol {
return self.dirs[index]
}
//清空
func clear() {
self.dirs.removeAll()
}
}
角色三:葉子節(jié)點(太監(jiān)節(jié)點->沒有兒子)(Leaf)
final class File: DirProtocol {
var name: String
var dirs:Array<DirProtocol>
init(name:String) {
self.name = name
self.dirs = Array<DirProtocol>()
}
func doSomthing() {
print("節(jié)點名稱:\(self.name)")
}
//添加
func addChild(child:DirProtocol) {
print("發(fā)送錯誤,葉子節(jié)點沒有子節(jié)點...")
}
//刪除
func removeChild(child:DirProtocol){
print("發(fā)送錯誤,葉子節(jié)點沒有子節(jié)點...")
}
//得到
func getChild(index:Int) -> DirProtocol {
print("發(fā)送錯誤,葉子節(jié)點沒有子節(jié)點...")
//拋異常
return self.dirs[index]
}
//清空
func clear() {
print("發(fā)送錯誤,葉子節(jié)點沒有子節(jié)點...")
}
}