ConcreteClass는 AbstractClass를 통하여 알고리즘의 변하지 않는 처리 단계를 구현한다.
import Foundation
// 상위 클래스 또는 추상 클래스 역할을 하는 클래스
class Algorithm {
// 템플릿 메서드
final func templateMethod() {
step1()
step2() // 디폴트 구현 제공
step3()
}
// 추상 메서드 - 하위 클래스에서 구현해야 함
func step1() {
fatalError("This method must be overridden")
}
func step3() {
fatalError("This method must be overridden")
}
// 디폴트 구현 제공
func step2() {
print("Default implementation of step 2")
}
}
// 하위 클래스 1
class CustomAlgorithm: Algorithm {
override func step1() {
print("Custom step 1")
}
override func step3() {
print("Custom step 3")
}
// step2를 비정상적으로 억제하거나 변경
override func step2() {
fatalError("Step 2 is not supported in CustomAlgorithm")
}
}
// 하위 클래스 2
class AnotherAlgorithm: Algorithm {
override func step1() {
print("Another step 1")
}
override func step3() {
print("Another step 3")
}
}
// 사용 예시
let algorithms: [Algorithm] = [CustomAlgorithm(), AnotherAlgorithm()]
for algorithm in algorithms {
algorithm.templateMethod()
}
...흠.. 그냥 프로토콜 지향 아닌가..