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
'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 |
댓글