방문자 패턴
- 객체의 구조와 객체가 수행해야 하는 작업을 분리하여, 새로운 작업을 추가할 때 구조를 수정하지 않고도 확장할 수 있도록 해주는 디자인 패턴
- 주로 복잡한 객체 구조를 다룰 때 유용하며, 각 객체가 다양한 작업을 수행해야 할 때 적용 가능
- Double Dispatch 활용 가능
- 객체가 두 번의 메서드 호출을 통해 자신에게 적합한 메서드를 결정하고 실행한다는 것을 의미
- 이를 통해 객체 구조에 새 기능을 추가해야 할 때, 기존 클래스의 수정 없이 확장 가능
- 여러 타입의 객체를 다루는 작업을 캡슐화하여 코드의 유지보수성과 확장성을 높임
주요 구성 요소
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
방문자 패턴 장단점
장점
단점
- 객체 구조가 복잡해질수록 방문자 패턴의 구현도 복잡도 증가
- 새로운 복잡도가 추가될 때마다 모든 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의 디자인 패턴 - 백기선 강사님
반응형
'Design Pattern' 카테고리의 다른 글
[디자인 패턴] Reactor Pattern (0) | 2024.07.15 |
---|---|
[디자인 패턴] 템플릿 메서드 패턴 (Template Method Pattern) (0) | 2024.07.03 |
[디자인 패턴] 전략 패턴 (Strategy Pattern) (0) | 2024.07.03 |
[디자인 패턴] 상태 패턴 (State Pattern) (0) | 2024.07.03 |
[디자인 패턴] 옵저버 패턴 (Observer Pattern) (0) | 2024.07.02 |