책 [JAVA 언어로 배우는 디자인 패턴 입문 3판;유키 히로시 저]을 참고하여 작성하였습니다.
데이터 구조의 각 요소에 대해 처리를 한다.
많은 요소가 모여 있는 내부를 돌아다니며 같은 처리를 반복해서 적용한다.
데이터 구조와 처리를 분리한다.
- 부품으로서의 독립성을 높여준다, OCP 설계 원칙의 적용
Visitor 추상클래스, visit(***) 선언
ConcreteVisitor 클래스, visit(***) 메서드 구현
Element 데이터 구조 나타내는 인터페이스, 방문자를 받아들이는 accept 메서드 선언
ConcreteElement 구체 클래스, File, Directory, accept 메서드 구현
ObjectStructure Element 집합, Directory 클래스는 각각의 Element를 다룰 수 있도록 iterator 메서드가 준비됨 - Iterable<Element> 구현
Element 인터페이스에 선언되어 있는 추상 메소드 accept를 실제로 구현하는 것이 Entry의 하위 클래스인 File, Directory 클래스다. Visitor 클래스는 방문하는 곳의 데이터 구조에 의존한다.
public abstract class Visitor {
public abstract void visit(File file);
public abstract void visit(Directory directory);
}
public interface Element {
public abstract void accept(Visitor v);
}
디렉토리 안 요소가 Entry(파일, 디렉토리)인데 entry.accept(this)을 통해 entry 요소가 visit()을 호출한다. visit()와 accept()를 통해 같은 처리가 반복되는 것을 알 수 있다.
@Override
public void visit(Directory directory) {
System.out.println(currentDir + "/" + directory);
String savedir = currentdir;
currentdir = currentdir + "/" = directory.getName();
for(Entry entry: directory) {
entry.accept(this);
}
currentdir = savedir;
}
더블 디스패치 - 반대 관계
element는 visitor를 받아들이고, visitor는 element를 방문한다.
데이터 구조 안의 요소에 선언된 accept() 메서드에서 Visitor 클래스의 visit()을 호출하고, Visitor 클래스의 visit()에서는 다시 각 요소에 대한 accept() 메서드를 호출한다. accept()과 visit()에서 서로 상대방을 호출한다.
'문제 및 이론 정리 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] Proxy - 필요해지면 만든다 (0) | 2025.02.22 |
---|---|
[디자인패턴] Decorator - 장식틀과 내용물을 동일시한다 (0) | 2025.02.21 |
[디자인패턴] Iterator - 처리를 반복한다 (1) | 2025.02.18 |
[디자인패턴] Bridge - 기능 계층과 구현 계층을 분리한다 (2) | 2025.02.04 |
[디자인패턴] Strategy - 스위치를 전환하듯 알고리즘을 바꾼다 (0) | 2025.02.03 |