비지터 패턴이란?
visitor의 사전적 의미는 방문객, 손님이라는 의미이다.
방문자 패턴(Visitor pattern)은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 객체의 구조와 그 구조에서 수행되는 작업을 분리하여 구현하는 패턴입니다.
방문자 패턴은 객체 구조를 이루는 요소들을 독립적으로 변경할 수 있도록 하는 패턴입니다. 즉, 객체의 구조와 구조에서 수행되는 작업을 분리하여 구현함으로써 객체의 확장성과 유연성을 높이는데 목적이 있습니다.
방문자 패턴에서는 객체 구조를 이루는 클래스들과 이들을 순회하는 방문자(visitor) 클래스를 정의합니다. 이 방문자 클래스는 객체 구조의 각 클래스를 방문하면서 그 클래스에서 수행할 작업을 구현합니다. 객체 구조에서는 방문자를 인자로 전달받아 각 클래스에서 방문자의 visit 메소드를 호출하면서 자신을 방문하도록 합니다.
이렇게 방문자 패턴을 사용하면 객체 구조를 수정하지 않고도 새로운 작업을 추가하거나 객체 구조를 순회하는 방법을 변경할 수 있습니다. 또한, 객체 구조의 요소들이 서로 다른 방문자들을 사용하여 서로 다른 작업을 수행할 수 있도록 하며, 이를 통해 객체의 유연성을 높일 수 있습니다.
비지터 패턴 구조

• Visitor
방문자 클래스의 인터페이스
visit(Element) 을 공용 인터페이스로 쓴다. Element 는 방문 공간이다.
• Element
방문 공간 클래스의 인터페이스
accept(Vistor) 를 공용 인터페이스로 쓴다. Visitor 는 방문자다.
내부적으로 Vistor.visit(this) 를 호출한다.
• ConcreteVisitor
Visitor 를 구체적으로 구현한 클래스
• ConcreteElement
Element 를 구체적으로 구현한 클래스
비지터 패턴 코드
public interface Visitor {
int visit(Book book);
int visit(Music music);
int visit(Movie movie);
}
public interface Element {
int accept(Visitor visitor);
}
public class Book implements Element {
private int price;
public Book(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
@Override
public int accept(Visitor visitor) {
return visitor.visit(this);
}
}
public class Music implements Element {
private int price;
public Music(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
@Override
public int accept(Visitor visitor) {
return visitor.visit(this);
}
}
public class Movie implements Element {
private int price;
public Movie(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
@Override
public int accept(Visitor visitor) {
return visitor.visit(this);
}
}
public class PriceCalculator implements Visitor {
@Override
public int visit(Book book) {
return book.getPrice();
}
@Override
public int visit(Music music) {
return music.getPrice() * 2;
}
@Override
public int visit(Movie movie) {
return movie.getPrice() * 3;
}
}
public class Main {
public static void main(String[] args) {
Element book = new Book(10000);
Element music = new Music(5000);
Element movie = new Movie(15000);
Visitor visitor = new PriceCalculator();
int totalPrice = book.accept(visitor) + music.accept(visitor) + movie.accept(visitor);
System.out.println("Total price = " + totalPrice);
}
}
이 예제에서는 Book, Music, Movie 클래스의 인스턴스를 생성하고, PriceCalculator 클래스의 인스턴스를 생성합니다. 각각의 상품 인스턴스에서는 accept 메소드를 호출하여 PriceCalculator 클래스의 visit 메소드를 호출합니다. 마지막으로, 각각의 가격을 더하여 총 가격을 출력합니다.
[디자인 패턴 15편] 행동 패턴, 방문자 (Visitor)
[Design Pattern] Visitor(방문자) 패턴이란?