组合模式定义
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性
组合模式使用场景
场景一:表示对象的部分-整体结构时
场景二:从一个整体中能够独立出部分模块或功能的场景
组合模式-角色划分
角色一:抽象根节点(Component)
角色二:具体子节点(Composite)
角色三:叶子节点(太监节点->没有儿子)(Leaf)
(iOS开发中,UIView以及其子控件的使用)
组合模式UML图
案例
组合模式UIView的使用.png
![](https://img.haomeiwen.com/i2335363/082fabd68a4c3629.png)
角色一:抽象根节点(Component)
protocol DirProtocol {
//特点一:节点名字
var name:String{get}
//特点二:子节点(数组)
var dirs:Array<DirProtocol>{get}
//特点三:业务逻辑
func doSomthing()
func addChild(child:DirProtocol)
func removeChild(child:DirProtocol)
func getChild(index:Int) -> DirProtocol
func clear()
}
角色二:具体子节点(Composite)
class Folder: DirProtocol {
var name: String
var dirs:Array<DirProtocol>
init(name:String) {
self.name = name
self.dirs = Array<DirProtocol>()
}
func doSomthing() {
print("节点名称:\(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()
}
}
角色三:叶子节点(太监节点->没有儿子)(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("节点名称:\(self.name)")
}
//添加
func addChild(child:DirProtocol) {
print("发送错误,叶子节点没有子节点...")
}
//删除
func removeChild(child:DirProtocol){
print("发送错误,叶子节点没有子节点...")
}
//得到
func getChild(index:Int) -> DirProtocol {
print("发送错误,叶子节点没有子节点...")
//抛异常
return self.dirs[index]
}
//清空
func clear() {
print("发送错误,叶子节点没有子节点...")
}
}
网友评论