목차
개요
내용
요약
객체들에 적용되어야 할 연산을 정의한 후, 기존 클래스의 변경없이 새로운 연산을 할 수 있도록 하자.
예시
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 |