문제 및 이론 정리/디자인패턴

[디자인패턴] Visitor - 데이터 구조를 돌아다니면서 처리한다

hail2y 2025. 2. 18. 23:59

책 [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()에서 서로 상대방을 호출한다.