在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协议,因此校长也可以直接把教师添加到下属中进行直接管理。
网友评论