[swift] Visitor 디자인 패턴

Visitor 디자인 패턴은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나입니다. 주로 객체를 조작하거나 객체 그룹에 대한 작업을 수행하는 데 유용합니다. Visitor 패턴의 핵심 아이디어는 객체의 구조와 작업을 분리하는 것입니다.

패턴의 구성요소

Visitor 패턴은 크게 아래와 같은 구성요소로 이루어져 있습니다.

패턴의 동작

Visitor 패턴은 아래와 같은 순서로 동작합니다.

  1. ConcreteVisitor 클래스를 만듭니다. 여기에는 Visitor 인터페이스를 구현한 메서드들이 포함됩니다.
  2. ConcreteElement 클래스를 만듭니다. 여기에는 Element 인터페이스를 구현한 메서드들이 포함됩니다.
  3. ObjectStructure 클래스를 만듭니다. 이 클래스는 ConcreteElement 객체들을 유지하고, Visitor를 받아들이는 메서드를 제공합니다.
  4. 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 패턴을 구현한 예시입니다.

참고문헌: