방문자 패턴이란 무엇이고 왜 사용하는가?
객체에서 구조와 기능을 분리시킴으로써 구조는 변경하지 않고 기능만을 변경시켜 확장 가능하도록 도와주는 패턴
- 컴포짓 패턴과 함께 사용되는 경우가 많다.
https://jwdeveloper.tistory.com/249?category=862052
실습
구조와 기능을 분리시키기 위해서 두 개의 인터페이스를 설정
- Visitor : 실제 구현부 - Visitable을 참조
- Visitable : Element Visitor가 방문하는 인터페이스
Visitor - visit 메서드의 파라미터에 Visitable 타입이 들어가는 것에 주목
public interface Visitor {
public void visit(Visitable visitable);
}
Visitable - accept 메서드의 파라미터에 Visitor 타입이 들어가는 것에 주목
public interface Visitable {
public void accept(Visitor visitor);
}
VisitorA - Visitable 방문시 나이의 개수를 누적한다.
public class VisitorA implements Visitor{
private int ageSum;
public VisitorA() {
// TODO Auto-generated constructor stub
ageSum = 0;
}
@Override
public void visit(Visitable visitable) {
// TODO Auto-generated method stub
if (visitable instanceof VisitableA) {
ageSum += ((VisitableA) visitable).getAge();
}else {
}
}
public int getAgeSum() {
return ageSum;
}
}
VisitableA
public class VisitableA implements Visitable{
private int age;
public VisitableA(int age) {
super();
this.age = age;
}
@Override
public void accept(Visitor visitor) {
// TODO Auto-generated method stub
visitor.visit(this);
}
public int getAge() {
return age;
}
}
Main
public class Main {
public static void main(String[] args) {
List<Visitable> visitables = new ArrayList<Visitable>();
visitables.add(new VisitableA(1));
visitables.add(new VisitableA(2));
visitables.add(new VisitableA(3));
visitables.add(new VisitableA(4));
visitables.add(new VisitableA(5));
Visitor visitor = new VisitorA();
for (Visitable visitable : visitables) {
visitable.accept(visitor);
}
System.out.println(((VisitorA) visitor).getAgeSum());
}
}
References
'CS > DesignPattern' 카테고리의 다른 글
(DesignPattern) 옵져버 패턴(1) (0) | 2020.05.30 |
---|---|
(DesignPattern) 책임사슬 패턴 (0) | 2020.05.30 |
(DesignPattern) 데코레이터 패턴 (0) | 2020.05.30 |
(DesignPattern) 컴포짓 패턴 (0) | 2020.05.29 |
(DesignPattern) 브릿지 패턴 (0) | 2020.05.17 |