비지터는 기존 코드를 변경하지 않고 기존 클래스 계층구조에 새로운 행동들을 추가할 수 있도록 하는 행동 디자인 패턴입니다.
제 설명글 [비지터와 이중 디스패치]{비지터와 이중 디스패치}에서 왜 단순히 비지터들을 메서드 오버로딩으로 대체할 수 없는지 알아보세요.
복잡도:
인기도:
사용 사례들: 비지터는 복잡하고 적용 범위가 좁기 때문에 매우 일반적인 패턴이 아닙니다.
다음은 코어 자바 라이브러리로부터 가져온 패턴의 몇 가지 예시들입니다:
모양들을 XML로 내보내기
이 예시에서는 기하학적 모양들의 집합을 XML로 내보내려고 합니다. 문제는 우리는 모양들의 코드를 직접 변경하고 싶지 않고, 변경하더라도 최소한의 변경만 수행하고 싶습니다.
최종적으로 비지터 패턴은 모양 계층구조 클래스들의 기존 코드를 변경하지 않고 해당 계층구조에 모든 행동들을 추가할 수 있도록 하는 인프라를 구축합니다.
shapes
shapes/Shape.java: 공통 모양 인터페이스
shapes/Dot.java: 점
shapes/Circle.java: 원
shapes/Rectangle.java: 직사각형
shapes/CompoundShape.java: 복합 모양
visitor
visitor/Visitor.java: 공통 비지터 인터페이스
visitor/XMLExportVisitor.java: 구상 비지터, 모든 모양을 XML 형태로 내보냅니다
Demo.java: 클라이언트 코드
OutputDemo.txt: 실행 결과