美文网首页iOS Swift 5.2 设计模式
Swift 5.2 Composite Pattern 组合模式

Swift 5.2 Composite Pattern 组合模式

作者: Sunooo | 来源:发表于2020-07-14 18:45 被阅读0次

在Swift中组合模式可以通过协议实现,面向协议编程。
例如在一所小学校中,有校长,年级主任,教师,他们都拥有相同的属性,名字,工号,都可以检查,校长检查主任的工作,主任检查教师的工作。这种层级关系,最适合使用组合模式编程。

import Foundation

protocol SchoolMemberProtocol {
    var name: String { get }
    var number: Int { get }
    var subordinateStaff: [SchoolMemberProtocol] { set get }
    func check()
    func addSubordinateStaff(_ staff: SchoolMemberProtocol)
    
}

final class Teacher: SchoolMemberProtocol {
    var name: String
    var number: Int
    var subordinateStaff: [SchoolMemberProtocol] = []
    
    init(name: String, number: Int) {
        self.name = name
        self.number = number
    }
    
    func check() {
        print("Teacher \(name) number \(number) is checking students' homework")
    }
    
    func addSubordinateStaff(_ staff: SchoolMemberProtocol) {
        
    }
}

final class Director: SchoolMemberProtocol {
    var name: String
    var number: Int
    var subordinateStaff: [SchoolMemberProtocol] = []
    
    init(name: String, number: Int) {
        self.name = name
        self.number = number
    }
    
    func check() {
        print("Director \(name) number \(number) is checking teachers' work")
    }
    
    func addSubordinateStaff(_ staff: SchoolMemberProtocol) {
        subordinateStaff.append(staff)
    }
}

final class Principal: SchoolMemberProtocol {
    var name: String
    var number: Int
    var subordinateStaff: [SchoolMemberProtocol] = []
    
    init(name: String, number: Int) {
        self.name = name
        self.number = number
    }
    
    func check() {
        for staff in subordinateStaff {
            staff.check()
        }
        print("Principal \(name) number \(number) is checking director' work")
    }
    
    func addSubordinateStaff(_ staff: SchoolMemberProtocol) {
        subordinateStaff.append(staff)
    }
}

let charlie = Principal(name: "Charlie", number: 001)

let steven = Director(name: "Setven", number: 010)
let john = Director(name: "John", number: 011)

let jack = Teacher(name: "Jack", number: 021)
let tom = Teacher(name: "Tom", number: 022)
let bill = Teacher(name: "Bill", number: 023)

charlie.addSubordinateStaff(steven)
charlie.addSubordinateStaff(john)

steven.addSubordinateStaff(jack)
steven.addSubordinateStaff(tom)

john.addSubordinateStaff(bill)

charlie.check()

Charlie是校长,把主任Steven和John添加为下属,Steven把教师Jack和Tom添加为下属,把相同的属性和方法直接在协议中声明,然后分别实现。
下属subordinateStaff是一个数组,要求数组中每一个元素都遵守SchoolMemberProtocol协议,因此校长也可以直接把教师添加到下属中进行直接管理。

相关文章

网友评论

    本文标题:Swift 5.2 Composite Pattern 组合模式

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