본문 바로가기
Theory/Design Pattern

Visitor Pattern

by y.j 2022. 5. 22.
728x90

Visitor Pattern

object구조의 요소들을 수행 할 operation을 나타낸다. Visitor는 요소 class의 변화없이 새로운 operation을 정의 할 수 있다.

위 그림은 Composite pattern에서 사용하였던 구조이다. 위와 같은 구조가 있을 때 각 요소에 대한 operation은 직접정의 할 수 있겠지만 공통된 operation은 visitor pattern내에 정의하여 사용 할 수 있다. 코드의 재사용성이 올라가며 추가적인 operation이 필요할 때 모든 요소들에 추가하는 것이 아니라 visitor에 추가하면 되기 때문에 유지보수에도 용이하다.

 

solution

object구조의 요소들을 대신 수행 할 Visitor object를 정의한다. 이 object는 요소들을 수행할 operation을 가지고 있으며 요소들을 visitor를 받을 수 있는 accept함수를 가지고 있다.

 

Element class

public abstract class Element {
    public abstract void accept(Visitor visitor);
}
public class ElementA extends Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visitElementA(this);
    }

    public String operationA() {
        return "Hello World from ElementA!";

    }
}

 

Visitor class

public abstract class Visitor {
    public abstract void visitElementA(ElementA e);
    public abstract void visitElementB(ElementB e);
}

 

operation이 필요한 요소들에게 visitor를 인자로 주어 operation을 대신 수행한다.

public class Visitor1 extends Visitor {
    @Override
    public void visitElementA(ElementA e) {
        System.out.println("Visit1: Visiting (doing something on) ElementA. \n" +
                e.operationA());
    }

    @Override
    public void visitElementB(ElementB e) {
        System.out.println("Visit1: Visiting (doing something on) ElementB. \n" +
                e.operationB());
    }
}

 

Advantages

• 새로운 operation을 추가하기 쉽다.
• 상속을 통해 다른 타입의 요소들도 방문 할 수 있다.

 - visitor는 interface를 가지는 것이 아니라 요소의 class(ElementA, ElementB)를 받기 때문에 다른 타입의 요소들도 방문 할 수 있도록 구현이 가능하다.

• state를 조작할 수 있다.

 - 요소들을 방문 하면서 더하거나 빼는 것처럼 행동을 정의할 수 있다.

 

Disadvantages

• 새로운 class들을 지원하기 위해서는 visitor interface를 정의하는 것이 필요하다

 - interface를 상속받는 것이 아니라 요소의 class를 직접 정의하기 때문에 추가가 있을 경우 interface를 변경하여야만 한다.

 - object구조가 잘 변경되지 않는 곳에서 사용하는 것이 좋다.

• 요소의 interfce를 확장시켜야 할 수 있다.

 - 요소들이 visitor가 데이터나 operation을 사용할 수 있도록 확장해야 할 수 있다.

• 유동성을 제공하는 대신에 추가적인 level이 필요하다.

 - 디자인이 복잡해 질 수 있다.

[전체코드]

https://github.com/jKyounju/adapterPatterns/tree/master/src/BehavioralPattern/VisitorPattern

https://github.com/jKyounju/adapterPatterns/blob/master/test/BehavioralPattern/VisitorPatternTest.java

728x90

'Theory > Design Pattern' 카테고리의 다른 글

MVC Pattern  (0) 2022.05.23
Template Method Pattern  (0) 2022.05.22
Strategy Pattern  (0) 2022.05.22
State Pattern  (0) 2022.05.21
Observer Pattern  (0) 2022.05.21

댓글