组合模式

组合模式定义

将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性

组合模式使用场景

场景一:表示对象的部分-整体结构时
场景二:从一个整体中能够独立出部分模块或功能的场景

组合模式-角色划分

角色一:抽象根节点(Component)
角色二:具体子节点(Composite)
角色三:叶子节点(太监节点->没有儿子)(Leaf)
(iOS开发中,UIView以及其子控件的使用)

组合模式UML图

案例
组合模式_第1张图片
组合模式UIView的使用.png

组合模式_第2张图片
组合模式案例.png

角色一:抽象根节点(Component)

protocol DirProtocol {
    //特点一:节点名字
    var name:String{get}
    //特点二:子节点(数组)
    var dirs:Array{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
    
    init(name:String) {
        self.name = name
        self.dirs = Array()
    }
    
    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
    
    init(name:String) {
        self.name = name
        self.dirs = Array()
    }
    
    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("发送错误,叶子节点没有子节点...")
    }
    
}

你可能感兴趣的:(组合模式)