Design Patterns

[Design Patterns] Visitor

우라릭 2024. 6. 17. 00:13

 

 

목차

    개요

    내용

    요약

    객체들에 적용되어야 할 연산을 정의한 후, 기존 클래스의 변경없이 새로운 연산을 할 수 있도록 하자.

    예시

    AST(abstract syntax tree)을 생성하는 컴파일러를 생각해봅시다. 이 컴파일러는 생성된 AST에 의미 분석을 해야합니다. 이를 위해 컴파일러는 타입 체크, 코드 최적화 등을 해야 합니다. 이를 위해 아래와 같은 클래스 구조를 생각해볼 수 있습니다.

    하지만 이런 방식을 채택하면 모든 연산들이 다양한 노드 클래스에 분산되어있어 시스템을 유지보수하고 변경하기 어려워집니다. 새로운 연산이 독립적인 클래스에 정의되고, 노드 클래스와 상관없이 된다면 유지보수하기 더 나을겁니다. 

     그렇게 하기 위해서 연관된 연산을 별도의 객체인 비지터로 빼내고 이를 노드에 넘겨주는 방식을 사용할 수 있습니다. 만약 노드가 방문자(비지터)를 받아들이면, 연산을 수행하는거죠.

    바뀐 노드 클래스의 계층관계는 아래와 같습니다.

    구조

    이야깃거리

    언제 써야 할까?

    • 이질적이고 연관이 없어보이는 연산을 객체에 수행해야할 때 객체를 더럽히고 싶지 않길 원한다면 사용하세요.
    • 객체 구조의 클래스들은 거의 변화가 없어야 하지만 새로운 연산을 자주 추가해야할 때 사용하세요.

    장단점

    • (Pros) 새로운 연산을 쉽게 추가하게 해줍니다.
    • (Pros) 연관된 연산을 모으고 연관없는 연산을 분리해줍니다.
    • (Cons) 캡슐화를 깨뜨립니다. 

    Case Study

     

    출처

    GoF Design Patterns

    'Design Patterns' 카테고리의 다른 글

    [Design Patterns] Template Method  (0) 2024.06.16
    [Design Patterns] Strategy  (0) 2024.06.16
    [Design Patterns] State  (0) 2024.06.09
    [Design Patterns] Observer  (0) 2024.06.09
    [Design Patterns] Memento  (0) 2024.06.06