Visitor 패턴이란 오브젝트 Structure로부터 알고리즘을 분리해내는 방법이다. 이렇게되면 기존의 오브젝트 구조에 대한 수정없이 원하는 알고리즘을 자유롭게 적용시킬 수 있다 -> open/closed 원칙을 따르는 디자인패턴!
protocol Visitor {
func visit(elem: Cat)
}
class NameVisitor: Visitor {
func visit(elem: Cat) {
print(elem.name)
}
}
class AgeVisitor: Visitor {
func visit(elem: Cat) {
print(elem.age)
}
}
class Cat {
let name: String
let age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func speak() {
print("Meow")
}
func accept(visitor: Visitor) {
print("Use implementation of visitor")
visitor.visit(elem: self)
}
}
// Example usage
let cat = Cat(name: "Whiskers", age: 3)
let nameVisitor = NameVisitor()
let ageVisitor = AgeVisitor()
cat.accept(visitor: nameVisitor) // "Whiskers"
cat.accept(visitor: ageVisitor) // "3"