[python] 비지터 패턴

비지터 패턴은 객체 구조에서 알고리즘을 분리하여 새로운 동작을 추가하는 디자인 패턴입니다. 이 패턴은 객체의 클래스를 변경하지 않고도 객체 구조에 새로운 동작을 추가하고자 할 때 유용합니다.

패턴 구성요소

비지터 패턴은 다음과 같은 구성요소로 이루어져 있습니다:

  1. 방문자 (Visitor): 새로운 동작을 정의한 인터페이스입니다. 객체 구조를 특정 순서로 순회하며, 각 객체에 대한 동작을 정의하는 메서드를 제공합니다.
  2. 구체적인 방문자 (Concrete Visitor): 방문자 인터페이스를 구현한 클래스입니다. 실제로 새로운 동작을 정의하고 객체 구조를 순회하는 역할을 수행합니다.
  3. 요소 (Element): 방문자가 동작을 수행할 객체의 인터페이스입니다. 방문자를 받아들이는 accept 메서드를 제공합니다.
  4. 구체적인 요소 (Concrete Element): 요소 인터페이스를 구현한 클래스입니다. accept 메서드에서 구체적인 방문자의 동작을 호출하여 자신에게 대해 동작을 수행하도록 합니다.
  5. 객체 구조 (Object Structure): 요소들의 집합입니다. 일반적으로 컨테이너 형태로 구현되며, 방문자가 순회할 수 있도록 accept 메서드를 제공합니다.

사용 예시

# 방문자 인터페이스
class Visitor:
    def visit(self, element):
        pass

# 구체적인 방문자
class ConcreteVisitor(Visitor):
    def visit(self, element):
        # 요소에 대한 동작을 정의하는 코드
        pass

# 요소 인터페이스
class Element:
    def accept(self, visitor):
        pass

# 구체적인 요소
class ConcreteElement(Element):
    def accept(self, visitor):
        visitor.visit(self)

# 객체 구조
class ObjectStructure:
    def __init__(self):
        self.elements = []

    def add_element(self, element):
        self.elements.append(element)

    def accept(self, visitor):
        for element in self.elements:
            element.accept(visitor)

# 객체 생성
element1 = ConcreteElement()
element2 = ConcreteElement()

# 객체 구조 생성 및 요소 추가
object_structure = ObjectStructure()
object_structure.add_element(element1)
object_structure.add_element(element2)

# 방문자 생성 및 객체 구조에 적용
visitor = ConcreteVisitor()
object_structure.accept(visitor)

위의 예시에서, ConcreteVisitor 클래스는 실제로 새로운 동작을 정의합니다. visit 메서드에서 요소에 대한 동작을 수행합니다.

ConcreteElement 클래스는 accept 메서드에서 구체적인 방문자의 동작을 호출하여 자신에게 대해 동작을 수행하도록 합니다.

ObjectStructure 클래스는 요소들의 집합을 관리하며, accept 메서드로 방문자가 객체 구조를 순회할 수 있도록 합니다.

비지터 패턴을 사용하면 새로운 동작을 추가하는 데에 있어서 객체의 소스 코드를 변경할 필요 없이 기존 구조에 새로운 동작을 적용할 수 있습니다.

참고 문서