美文网首页
1.组合模式

1.组合模式

作者: Mcyboy007 | 来源:发表于2017-02-27 10:37 被阅读0次

    让我们能用树形方式创建对象的结构,树里面包含了组合以及个别对象。使用组合结构,我们能把相同的操作应用在组合和个别对象上。即,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。

    /** 组合模式(摘抄自《Head First设计模式》):
      允许你将对象组合成树形结构来表现“整体/部分”层次结构。
      组合能让客户以一致的方式处理个别对象已经对象组合
    **/
    
    protocol FileType {
        func getFileName() -> String
        func addFile(file: FileType)
        func deleteFile(file: FileType)
        func display()
    }
    //延展中给出具体文件不需要实现的方法,类似于抽象类中的方法实现
    extension FileType {
        func addFile(file: FileType) {}
        func deleteFile(file: FileType){}
    }
    
    class Folder: FileType {
        private var files: Dictionary<String, FileType> = Dictionary<String, FileType>()
        private var folderName: String
        init(folderName: String) {
            self.folderName = folderName
        }
        
        func getFileName() -> String {
            return self.folderName
        }
        
        func addFile(file: FileType) {
            files[file.getFileName()] = file
        }
        
        func deleteFile(file: FileType) {
            files.removeValue(forKey: file.getFileName())
        }
        
        func display() {
            let allKeys = Array(files.keys)
            print(getFileName())
            for i in 0..<allKeys.count {
                files[allKeys[i]]?.display()
            }
        }
    }
    
    class BaseFile: FileType {
        private var fileName: String
        init(fileName: String) {
            self.fileName = fileName
        }
        
        func getFileName() -> String {
            return self.fileName
        }
        
        func display() {
            print(getFileName())
        }
    }
    
    class SwiftFile: BaseFile {
    }
    
    class ObjCFile: BaseFile {
    }
    
    //Test
    //创建根文件夹
    let rootFolder: FileType = Folder(folderName: "根文件夹")
    let objcFile1: FileType = ObjCFile(fileName: "objc1.h")
    let swiftFile1: FileType = SwiftFile(fileName: "file1.Swift")
    rootFolder.addFile(swiftFile1)
    rootFolder.addFile(objcFile1)
    
    let subFolder : FileType = Folder(folderName: "子文件夹")
    let objcFile2: FileType = ObjCFile(fileName: "objc2.h")
    let swiftFile2: FileType = SwiftFile(fileName: "file2.Swift")
    subFolder.addFile(swiftFile2)
    subFolder.addFile(objcFile2)
    
    rootFolder.addFile(subFolder)
    
    //输出该目录下的所有文件夹和文件名
    rootFolder.display()
    

    参考资料:
    1)《Header First设计模式》
    2)青玉伏案
    http://www.cnblogs.com/ludashi/

    相关文章

      网友评论

          本文标题:1.组合模式

          本文链接:https://www.haomeiwen.com/subject/pzxzwttx.html