티스토리 뷰
반응형
방문자 패턴을 이용하여 객체에서 처리를 분리해서 사용할 수 있다.
기본 설계
예제 소스
Visitor 및 Visitable
public interface Visitor {
public void visit(Visitable visitable);
}
public interface Visitable {
public void accept(Visitor visitor);
}
VisitorA 및 VisitableA
public class VisitorA implements Visitor{
private int ageSum;
public VisitorA() {
ageSum = 0;
}
@Override
public void visit(Visitable visitable) {
if(visitable instanceof VisitableA) {
ageSum += ((VisitableA) visitable).getAge();
} else {
//...
}
}
public int getAgeSum() {
return ageSum;
}
}
public class VisitableA implements Visitable {
private int age;
public VisitableA(int age) {
super();
this.age = age;
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Main 및 결과
public static void main(String[] args) {
ArrayList<Visitable> visitables = new ArrayList<>();
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();
//int ageSum = 0;
for (Visitable visitable : visitables) {
visitable.accept(visitor);
//ageSum += ((VisitableA)visitable).getAge();
}
System.out.println(((VisitorA)visitor).getAgeSum());
//System.out.println(ageSum);
}
주석에서 처리한 것 처럼 for문에서 간단하게 ageSum 변수를 이용해 getAge()를 가져와 덧셈결과를 호출할 수 있지만, 이 방식을 사용하게 되면 외부에 VisitableA의 구현이 노출되는 것으로 해당 구현을 활용하여 외부에서 더 복잡한 로직을 구성하여 for문에 추가할 수도 있다. 이런 경우 추후에 유지보수 측면에서 매우 비효율적인 결과를 나타낼 수 있으므로, Visitor 패턴을 활용하여 age들의 덧셈을 진행해주는 메소드(accept())만을 호출하여 유지보수 측면에서 효율적으로 나타낼 수 있다. (Why? 메소드명이 가시적으로 딱 보이므로!)
반응형
'Java > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 옵저버 패턴 (0) | 2020.06.22 |
---|---|
[디자인 패턴] 책임 사슬 패턴 (0) | 2020.06.07 |
[디자인 패턴] 데코레이터 패턴 (0) | 2020.05.24 |
[디자인 패턴] 컴포지트 패턴 (0) | 2020.05.24 |
[디자인 패턴] 브릿지 패턴 (0) | 2020.05.18 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- mustache
- 이펙티브 자바
- 자바8
- try with resources
- 인프런
- JPA
- try catch finally
- springboot
- 이펙티브자바
- 점층적 생성 패턴
- ifPresent
- Spring
- jdk버전
- @Lazy
- junit
- package-private
- 연관관계
- 정적팩터리메서드
- effectivejava
- Effective Java
- 스프링부트
- 김영한
- java
- 빌더 패턴
- flatMap
- 빈 순환 참조
- 팩토리 메소드 패턴
- 생성자
- 복사 팩토리
- java8
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함