Design Pattern

[디자인 패턴] 방문자 패턴 (Visitor Pattern)

꾸준함. 2024. 7. 5. 01:07

방문자 패턴

  • 객체의 구조와 객체가 수행해야 하는 작업을 분리하여, 새로운 작업을 추가할 때 구조를 수정하지 않고도 확장할 수 있도록 해주는 디자인 패턴
  • 주로 복잡한 객체 구조를 다룰 때 유용하며, 각 객체가 다양한 작업을 수행해야 할 때 적용 가능
  • Double Dispatch 활용 가능
    • 객체가 두 번의 메서드 호출을 통해 자신에게 적합한 메서드를 결정하고 실행한다는 것을 의미
    • 이를 통해 객체 구조에 새 기능을 추가해야 할 때, 기존 클래스의 수정 없이 확장 가능
    • 여러 타입의 객체를 다루는 작업을 캡슐화하여 코드의 유지보수성과 확장성을 높임

 

https://www.geeksforgeeks.org/visitor-design-pattern/

 

주요 구성 요소

 

1. Element

  • accept 메서드를 정의
  • 해당 메서드는 Visitor를 인자로 받아들이며, Visitor의 visit 메서드를 호출

 

2. ConcreteElement

  • Element 인터페이스를 구현체
  • 각 클래스는 자신의 타입을 인자로 받는 Visitor의 visit 메서드를 호출

 

3. Visitor

  • 방문자 인터페이스
  • 각 ConcreteElement 타입마다 방문자 메서드를 정의

 

4. ConcreteVisitor

  • Visitor 인터페이스를 구현체
  • 각 ConcreteElement 타입에 대해 실제 작업을 수행

 

5. Object Structure

  • Element 객체들을 포함하고 있으며, 이들을 순회하며 Visitor를 받아들이는 작업을 수행

 

방문자 패턴 구현 예시

 

1. Element

 

 

2. ConcreteElement

 

 

3. Visitor

 

 

4. ConcreteVisitor

 

 

5. ObjectStructure

 

 

방문자 패턴 장단점

 

장점

  • 기존 코드를 변경하지 않고 새로운 코드를 추가할 수 있음 (SOLID의 OCP 원칙)
  • 객체 구조와 기능을 수행하는 코드를 분리 가능 (SOLID의 SRP 원칙)

 

단점

  • 객체 구조가 복잡해질수록 방문자 패턴의 구현도 복잡도 증가
  • 새로운 복잡도가 추가될 때마다 모든 ConcreteElement 클래스에 변경이 필요

 

실무에서 쓰이는 방문자 패턴

 

1. 자바의 FileVisitor, SimpleFileVisitor

  • 파일 시스템의 트리를 탐색할 때 방문자 패턴을 활용한 대표적인 예로써 디렉터리 구조를 순회하면서 파일 및 디렉터리에 대한 다양한 작업을 수행

 

FileVisitor

  • FileVisitor는 Java NIO.2 API에 포함된 인터페이스로, 파일 트리를 탐색할 때 특정 작업을 수행하기 위해 사용
  • 해당 인터페이스는 파일이나 디렉터리를 방문할 때 호출되는 여러 메서드를 정의  
    • preVisitDirectory(T dir, BasicFileAttributes attrs): 디렉터리를 방문하기 전에 호출
    • visitFile(T file, BasicFileAttributes attrs): 파일을 방문할 때 호출
    • visitFileFailed(T file, IOException exc): 파일 방문이 실패할 때 호출
    • postVisitDirectory(T dir, IOException exc): 디렉터리를 방문한 후에 호출

 

SimpleFileVisitor

  • SimpleFileVisitor는 FileVisitor 인터페이스를 구현한 추상 클래스
  • 해당 클래스는 FileVisitor의 모든 메서드에 기본 구현을 제공하므로, 필요에 따라 원하는 메서드만 재정의

 

동작 방식

  • Element: Path 객체가 Element 역할
  • ConcreteElement: 파일 시스템의 각 파일 및 디렉터리 경로가 ConcreteElement 역할
  • Visitor: FileVisitor가 Visitor 인터페이스 역할
  • ConcreteVisitor: SimpleFileVisitor가 ConcreteVisitor 역할을 하며, 사용자가 필요에 따라 메서드를 재정의
  • Object Structure: Files.walkFileTree 메서드가 파일 시스템 트리를 순회하면서 FileVisitor를 호출


 

2. 스프링 프레임워크 BeanDefinitionVisitor

  • BeanDefinitionVisitor는 Bean 정의를 순회하면서 특정 작업을 수행하는 방문자 패턴의 구현 중 하나로 Bean 정의의 프로퍼티 값을 변환하거나 설정 가능
  • BeanDefinitionVisitor는 BeanDefinition 객체와 그 내부의 프로퍼티들을 방문하며 변환 작업을 수행

 

동작 방식

  • Element: BeanDefinition 객체가 Element 역할을 하며, 방문자를 받아들일 수 있는 메서드를 제공
  • ConcreteElement: RootBeanDefinition, ChildBeanDefinition 등 BeanDefinition의 다양한 구현체들이 ConcreteElement 역할
  • Visitor: BeanDefinitionVisitor가 Visitor 인터페이스 역할
  • ConcreteVisitor 클래스: BeanDefinitionVisitor를 확장하여 구체적인 방문 작업을 수행하는 클래스가 ConcreteVisitor 역할
  • Object Structure: BeanFactory나 다른 Bean 관리 구조가 Bean 정의를 순회하면서 방문자를 통해 작업을 수행하는 구조를 제공

 

참고

코딩으로 학습하는 GoF의 디자인 패턴 - 백기선 강사님

 

반응형