1.组合模式

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

/** 组合模式(摘抄自《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 = Dictionary()
    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.. 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.组合模式)