**13. Visitor - 데이터 구조를 돌아다니면서 처리한다
13. Visitor - 데이터 구조를 돌아다니면서 처리한다
Visitor 패턴은 객체 지향 소프트웨어 디자인 패턴 중 하나로, 객체의 구조와 동작을 분리시키는 데 사용됩니다. 주로 객체 구조 내에 있는 여러 유형의 객체를 방문하면서 특정 작업을 수행하거나 동작을 수행하기
위해 사용됩니다. 이 패턴은 객체 지향 언어에서 다형성을 활용하여 객체 간의 결합도를 낮추고 확장성을 높이는 데 도움이 됩니다.
Visitor 패턴은 다음과 같은 주요 구성 요소로 구성됩니다:
Visitor (방문자) 인터페이스: 방문자 패턴의 핵심 요소로, 여러 종류의 객체를 방문하면서 특정 작업을 수행하기 위한 메서드를 정의하는 인터페이스입니다. Visitor 인터페이스는 방문자가 어떤 객체를
방문할지에 대한 메서드를 정의합니다.ConcreteVisitor (구체적인 방문자): Visitor 인터페이스를 구현한 클래스로, 실제 방문자의 역할과 작업을 정의합니다.
Element (요소) 인터페이스: 방문자 패턴을 사용할 객체 구조의 요소를 나타내는 인터페이스입니다. Element 인터페이스는 방문자가 방문할 수 있는 메서드를 정의합니다.
ConcreteElement (구체적인 요소): Element 인터페이스를 구현한 클래스로, 객체 구조의 구체적인 요소를 나타냅니다. ConcreteElement 클래스는 방문자가 방문할 때 필요한 정보를
제공합니다.ObjectStructure (객체 구조): 여러 요소를 관리하고 방문자에게 요소를 전달하는 역할을 수행하는 클래스나 구조체입니다.
Visitor 패턴의 주요 아이디어는 요소와 방문자를 분리함으로써 요소의 구조를 변경하지 않고도 새로운 작업을 추가할 수 있게 만드는 것입니다. 방문자 패턴을 사용하면 객체 구조와 작업을 확장하기가 편리하며, 객체
간의 결합도가 낮아져 유지보수와 확장이 쉬워집니다.
Java에서 Visitor 패턴을 구현하려면 위에서 설명한 인터페이스와 클래스를 정의하고 객체 구조를 관리하는 ObjectStructure 클래스를 생성해야 합니다. 그런 다음 실제 작업을 수행하는
ConcreteVisitor 클래스를 구현하고, 요소를 나타내는 ConcreteElement 클래스를 정의해야 합니다. Visitor 패턴은 복잡한 객체 구조에서 다양한 작업을 수행하고자 할 때 유용하며, 특히 객체
구조가 자주 변경되거나 확장되어야 하는 경우에 유용합니다.
예제
Visitor 패턴의 간단한 Java 예제를 제공하겠습니다. 이 예제에서는 방문자 패턴을 사용하여 간단한 객체 구조를 관리하고 객체를 방문하여 작업을 수행합니다. 이 예제는 사과와 바나나를 나타내는 객체를 만들고,
방문자가 이러한 객체를 방문하면서 작업을 수행하는 방법을 보여줍니다.
- Visitor 인터페이스:
public interface Visitor {
void visit(Apple apple);
void visit(Banana banana);
}
- ConcreteVisitor 구현:
public class FruitVisitor implements Visitor {
@Override
public void visit(Apple apple) {
System.out.println("Visiting Apple");
// Apple에 대한 작업 수행
}
@Override
public void visit(Banana banana) {
System.out.println("Visiting Banana");
// Banana에 대한 작업 수행
}
}
- Element 인터페이스:
public interface Element {
void accept(Visitor visitor);
}
- ConcreteElement 구현:
public class Apple implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class Banana implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
- ObjectStructure:
import java.util.ArrayList;
import java.util.List;
public class FruitBasket {
private List<Element> elements = new ArrayList<>();
public void addElement(Element element) {
elements.add(element);
}
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
}
- 메인 클래스:
public class Main {
public static void main(String[] args) {
FruitBasket basket = new FruitBasket();
basket.addElement(new Apple());
basket.addElement(new Banana());
Visitor visitor = new FruitVisitor();
basket.accept(visitor);
}
}
이 예제에서, FruitVisitor는 Visitor 인터페이스를 구현하고 Apple과 Banana는 Element 인터페이스를 구현합니다. FruitBasket는 객체 구조를 관리하고, 방문자를 받아들이고 요소를
방문할 때 Visitor를 사용합니다. 메인 클래스에서는 간단한 객체 구조를 만들고 방문자를 통해 각 요소를 방문하면서 작업을 수행합니다. 결과적으로 출력은 "Visiting Apple"과 "Visiting
Banana"이 될 것입니다.