2009년 11월 12일 목요일

Visitor Pattern #2

Visitor 쪽과 Acceptor 쪽의 상호 호출

하나의 디렉터리에 두 개의 파일이 있을 때의 처리의 흐름을 다이어그램으로 나타내고 있습니다.
① 우선 Main 클래스가 ListVisitor의 인스턴스를 만듭니다. 예제프로그램에서는 다른 Directory나
     File의 인스턴스도 Main 클래스가 만들지만, 이 시퀸스 다이어그램에서는 생략
② Main은 Directory의 인스턴스에 대해서 accept 메소드를 호출합니다. 이때 인수에는 ListVisitor의
    인스턴스를 전달하지만 이 다이어그램에서는 생략
③ Directory의 인스턴스는 인수로 전달된 LsitVisitor의 Visit(Directory) 메소드를 호출
④ 그러면 LisiVisitor의 인스턴스는 그 디렉터리 안을 조사해서 최초의 파일인 accept 메소드를 호출
⑤ File의 인스턴스는 인수로 전달된 ListVisitor의 Visit(File) 메소드를 호출합니다.
    이때, LisiVisitor는 Visit(Directory)를 실행 중인 점을 주의하십시오(멀티스레드로서 실행중이라는
    의미가 아니고 호출이력(콜스택)안에는 Visit(Directory)가 있다는 의미입니다. 다이어그램에서는
    사각형을 오른족으로 반복해서 표시
⑥ Visit(File)와 accept에서 반환되면 이번에는 다른 File의 인스턴스(동일한 디렉터리의 2번째 파일)
    의 accept 메소드를 호출
⑦ 이전과 동일하게 File의 인스턴스는 Visit(File)의 메소드를 호출, 각 메소드의 처리가 끝나면 호출
    한 곳으로 점점 되돌아가서 마지막에는 Main의 accpet 메소드의 호출로부터 되돌아옵니다.

☞ Directory의 인스턴스나 File의 인스턴스에 대해서는 accpet 메소드가 호출된다.
☞ accept 메소드는 각 인스턴스에서 한번만 호출된다.
☞ ListVisitor의 인스턴스에 대해서는 Visit(Directory)나 Visit(File) 메소드가 호출된다.
☞ Visit(Directory)나 Visit(File)를 처리하고 있는 것은 하나의 ListVisitor의 인스턴스다.


Visitor Pattern의 등장인물

Visitor(방문자)의 역할
: Visitor는 데이터 구조의 구체적인 요소마다 'xxxx을 방문했다' 라는 visit(xxxx)메소드를 선언
  visit(xxxx)는 xxxx를 처리하기 위한 메소드이고, 실제 코드는 ConcreteVisitor 역할에
  예제프로그램에서 Visitor 클래스

ConcreteVisitor(구체적인 방문자) 역할
: Visitor역할의 인터페이스(API)를 구현
  visit(xxxx)라는 형태의 메소드를 구현하고, 각각의 ConcreteElement 역할의 처리를 기술
  예제프로그램에서 ListVisitor 클래스

Element(요소)의 역할
: Element는 Visitor역할의 방문할 곳을 나타내는 역할로 방문자를 받아들이는 accept 메소드를 선언
  accept 메소드의 인수에는 Visitor 역할이 전달
  예제프로그램에서 Acceptor 인터페이스

ConcreteElement(구체적인 요소) 역할
: Element역할의 인터페이스(API)를 구현하는 역할
  예제프로그램에서 File 클래스나 Directory 클래스

ObjectStructure(오브젝트 구조) 역할
: Element역할의 집합을 취급하는 역할
  예제프로그램에서 Directory 클래스(1인 2역)


 

댓글 없음:

댓글 쓰기