[이벤트 발생 주체(vtkObject)] → vtkSubjectHelper → vtkObserver → vtkCommand::Execute()
예측 시나리오
1. vtkObject에서 이벤트가 발생한다.
2. vtkObject의 멤버인 vtkSubjectHelper로 이벤트 전달
3. vtkSubjectHelper와 연결된 Observer에 이벤트 전달
4. Observer의 Next Observer에 이벤트 전파
5. 각 Observer의 멤버인 Command에서 이벤트 실행
아직 전체 코드를 다 보지는 않았기 때문에 대략 이런 내용이겠구나 생각하고 패스.
우선 vtkObserver부터 분석 시작
//----------------------------------Command/Observer stuff-------------------
// The Command/Observer design pattern is used to invoke and dispatch events.
// The class vtkSubjectHelper keeps a list of observers (which in turn keep
// an instance of vtkCommand) which respond to registered events.
-translate
//----------------------------------Command/Observer 관련 코드-------------------
// Command/Observer 디자인 패턴은 이벤트를 발생시키고 전달하는 데 사용된다.
// vtkSubjectHelper 클래스는 옵저버들의 리스트를 유지하고 있으며,
// 이 옵저버들은 각각 vtkCommand 인스턴스를 포함하고 있고,
// 등록된 이벤트에 반응한다.
마치 c의 구조체처럼 모든 멤버를 public으로 공개하고 있다.
이 클래스는 단방향 연결리스트의 노드처럼 Next로 다음 Observer를 들고 있어서, root node를 관리 주체에서 들고 있으면
줄줄이 소시지처럼 연결하는 형태로 구현되어 있다.
이걸 이후에 설명할 vtkSubjectHelper에서 Start라는 멤버 변수로 들고 있다.
vtkCommand는 이벤트를 확인하고 이벤트와 연결된 함수를 실행시켜주는 역할로 추정되지만,
vtkObserver만 봤을 때의 용도로는 EventId를 string으로 변환해주는 헬퍼함수 정도로 사용되는 것처럼 보인다.
5Q
현재 Observer에 대한 부분은 크게 분석할 것이 없어서 각 멤버 변수의 역할에 대해서만 정리하고 마무리하면 좋겠다.
Event의 역할은? 정수 형태의 EventId를 소유하고 추후 Command에서 사용하기 위해 보관
Command의 역할은? EventId를 바탕으로 Command에 구현된 Execute를 이용해서 이벤트를 호출
Tag의 역할은? 전역에서 Observer를 구별하고 삭제하기 위한 정수형 식별자(추정)
Next의 역할은? Observer 구조가 연결리스트로 이루어져 있기 때문에 다음 Observer에게 이벤트를 전파하기 위한 목적
Priority의 역할은? 이벤트가 발생했을 때, 중요도를 판별하여 실행 순서를 제어
'VTK > [VTK] 소스코드 분석' 카테고리의 다른 글
1. vtkTimeStamp (0) | 2025.07.20 |
---|
댓글