[swift] Visitor 디자인 패턴
Visitor 디자인 패턴은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나입니다. 주로 객체를 조작하거나 객체 그룹에 대한 작업을 수행하는 데 유용합니다. Visitor 패턴의 핵심 아이디어는 객체의 구조와 작업을 분리하는 것입니다.
패턴의 구성요소
Visitor 패턴은 크게 아래와 같은 구성요소로 이루어져 있습니다.
- Visitor 인터페이스: 방문자가 수행할 작업을 정의하는 인터페이스
- ConcreteVisitor: Visitor 인터페이스를 구현하는 클래스
- Element 인터페이스: 방문자를 수용하는 객체의 인터페이스
- ConcreteElement: Element 인터페이스를 구현하는 클래스
- ObjectStructure: ConcreteElement 객체들을 유지하고, Visitor를 받아들이는 메서드를 제공하는 클래스
- Client: ObjectStructure를 이용하여 Visitor 패턴을 사용하는 클라이언트
패턴의 동작
Visitor 패턴은 아래와 같은 순서로 동작합니다.
- ConcreteVisitor 클래스를 만듭니다. 여기에는 Visitor 인터페이스를 구현한 메서드들이 포함됩니다.
- ConcreteElement 클래스를 만듭니다. 여기에는 Element 인터페이스를 구현한 메서드들이 포함됩니다.
- ObjectStructure 클래스를 만듭니다. 이 클래스는 ConcreteElement 객체들을 유지하고, Visitor를 받아들이는 메서드를 제공합니다.
- Client에서 ObjectStructure를 이용하여 Visitor 패턴을 사용합니다.
또는, 코드 예시를 통해 자세히 살펴볼 수 있습니다.
//Visitor 인터페이스
protocol Visitor {
func visit(element: ConcreteElementA)
func visit(element: ConcreteElementB)
}
//ConcreteVisitor
class ConcreteVisitor: Visitor {
func visit(element: ConcreteElementA) {
print("Visiting ConcreteElementA")
}
func visit(element: ConcreteElementB) {
print("Visiting ConcreteElementB")
}
}
//Element 인터페이스
protocol Element {
func accept(visitor: Visitor)
}
//ConcreteElement
class ConcreteElementA: Element {
func accept(visitor: Visitor) {
visitor.visit(element: self)
}
}
class ConcreteElementB: Element {
func accept(visitor: Visitor) {
visitor.visit(element: self)
}
}
//ObjectStructure
class ObjectStructure {
private var elements = [Element]()
func add(element: Element) {
elements.append(element)
}
func accept(visitor: Visitor) {
for element in elements {
element.accept(visitor: visitor)
}
}
}
//Client
let objectStructure = ObjectStructure()
objectStructure.add(element: ConcreteElementA())
objectStructure.add(element: ConcreteElementB())
let visitor = ConcreteVisitor()
objectStructure.accept(visitor: visitor)
위 코드는 Visitor 패턴을 구현한 예시입니다.
참고문헌: