비지터 패턴 (Visitor Pattern)

구교석·2024년 4월 15일
post-thumbnail

비지터 패턴이란?

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(방문자) 패턴이란?

profile
끊임없이 노력하는 개발자

0개의 댓글