組合模式

組合模式定義

將對象組合成樹形結構以表示“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性

組合模式使用場景

場景一:表示對象的部分-整體結構時
場景二:從一個整體中能夠獨立出部分模塊或功能的場景

組合模式-角色劃分

角色一:抽象根節(jié)點(Component)
角色二:具體子節(jié)點(Composite)
角色三:葉子節(jié)點(太監(jiān)節(jié)點->沒有兒子)(Leaf)
(iOS開發(fā)中,UIView以及其子控件的使用)

組合模式UML圖

案例
組合模式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é)點...")
    }
    
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容