2016년 4월 1일 금요일

Design Pattern Digest - 13. Visitor

이글은 책 "Java언어로 배우는 디자인 패턴 입문"을 읽고 쓴 요약입니다. 
나만 이해하도록 불친절하게 작성되어 있습니다. 
자세한 내용은 책을 보세요. 


Visitor



  • (내용이 조금 어려움) 데이터 구조와 처리 로직을 분리하려는 목적
  • 자료구조에 해당하는 ConcreteElement는 accept()를 구현하고 여기에서 Visitor의 visit() 메소드들 중에 정확한 ConcreteElement를 인자로 받는 메소드를 호출한다. 
  • 즉, Visitor -> Element.accept() -> Visitor.visit(ConcreteElement) 호출 관계인데 이를 더블 디스패치 (double dispatch)라고 한다. 이렇게 하는 이유는 Element의 세부를 숨기고 Visitor의 처리 로직을 분기시키기 위한 목적이다. (Element가 동작을 결정하되 동작은 Visitor에 구현됨)
  • 장점으로 ConcreteVisitor를 추가 정의할 때 Element는 전혀 수정이 없다. 다만 ConcreteElement가 추가되면 모든 기존 ConcreteVisitor에 visit() 메서드를 하나씩 추가해야 된다. 
  • [예제]: Composite 패턴에서 나왔던 entry, file, directory를 생각해보자. Entry는 Element가 되고 File과 Directory는 ConcreteElement가 된다. 여기에 Vistor interface는 visit(file), visit(directory)의 두 가지 메소드를 정의한다. Composite 패턴에서는 File과 Directory가 print()와 같은 처리로직이 각각 들어가 있는 반면, 여기서는 ListVisitor가 처리로직을 가지고 있다. 



댓글 없음:

댓글 쓰기