JAVA/DesignPattern

Design Pattern 디자인 패턴 Visitor Pattern 방문자 패턴

호두밥 2022. 1. 3. 21:59

Visitor Pattern 방문자 패턴

행동 패턴으로, 알고리즘이 작동하는 객체와 알고리즘을 분리하는 패턴입니다. 방문자 객체가 알고리즘이 작동하는 객체의 알고리즘을 관리합니다.  

Visitor Pattern 방문자 패턴이 적합한 경우

  • 복잡한 객체 구조의 모든 요소에 대해 기능을 수행해야 하는 경우.
  • 부수적인 비즈니스 로직을 정리해야 하는 경우
  • 기능이 일부 클래스에서만 의미가 있고, 다른 클래스에서는 의미가 없을때. 

장단점

장점

  • 기존 객체를 수정하지 않고, 다른 객체와 함께 동작하는 기능을 추가할 수 있습니다. (개방폐쇄원칙)
  • 같은 기능을 다양한 버전으로 관리할 수 있습니다. (단일책임원칙)
  • 방문자 객체가 유용한 정보를 축적할 수 있습니다. 이 정보는 복잡한 객체 구조를 탐색하고, 이 구조의 각 객체에 방문자를 적용하는데 유용할 수 있습니다.

단점

  • 클래스가 삭제되거나 추가될때마다 모든 방문자 객체를 수정해 줄 필요가 있습니다.
  • 방문자 객체가 요소의 Private 필드나 메소드에 대한 접근 권한이 부족할 수 있습니다.

 

Visitor Pattern 방문자 패턴 구현

Visitor

public interface Visitor {
    void visitSupermarket(Supermarket supermarket);
    void visitSchool(School school);
}

BuildingVisitor

public class BuildingVisitor implements Visitor {
    @Override
    public void visitSupermarket(Supermarket supermarket) {
        System.out.println("Visit Supermarket");
    }

    @Override
    public void visitSchool(School school) {
        System.out.println("Visit School");
    }
}

Building

public interface Building {
    void visit(Visitor visitor);
}

School

public class School implements Building{
    @Override
    public void visit(Visitor visitor) {
        visitor.visitSchool(this);
    }
}

Supermarket

public class Supermarket implements Building{
    @Override
    public void visit(Visitor visitor) {
        visitor.visitSupermarket(this);
    }
}

Main

public class Main {
    public static void main(String[] args) {
        BuildingVisitor visitor = new BuildingVisitor();

        Supermarket supermarket = new Supermarket();
        supermarket.visit(visitor);

        School school = new School();
        school.visit(visitor);
    }
}
Visit Supermarket
Visit School

참조