Chapter 2. 옵저버 패턴에서 옵저버들이 데이터를 받아볼 수 있는 방식 두 가지에 대한 설명 중,
‘subject의 상태는 계속 바뀌는 것을 가정하기 때문에 해당 상태에 대한 getter 사용은 notify() 내부에서만 하는 것이 권장되며,
이러한 측면에서 볼 때 pull 방식이 아닌, data를 subject에서 push 하는 방식이 나을 수도 있다’고 작성하신 부분에서
제 의견을 공유하고, 정우님의 의견도 더 자세하게 들어보고 싶어서 이슈를 작성하게 되었습니다 🥰
notify()는 주제의 상태가 변경될 때마다 호출되는 것이므로, 두 방식은 다음과 같은 과정으로 진행한다고 이해했습니다.
만약 주제가 필드로 int status = 1라는 상태를 가지고 있고
notify()가 호출된다면 옵저버는 주제의 status을 곧바로 출력하는 상황을 가정해보면,
[ push 방식 ]
- status = 2로 변경되어 주제에서 notify()가 호출되어 status = 2가 옵저버에게 보내짐 (현재 status의 값은 2)
- 옵저버가 status를 받아보기 전에 status = 3으로 변경되는 경우,
다시 한번 notify()가 호출되어 status = 3가 옵저버에게 보내짐 (현재 status의 값은 3)
- 따라서 옵저버는 status = 2를 출력, 그 다음으로 status = 3도 출력
[ pull 방식 ]
- status = 2로 변경되어 주제에서 notify()가 호출됨 (현재 status의 값은 2)
- 옵저버가 status를 받아보기 전에 status = 3으로 변경되는 경우, 다시 한번 notify()가 호출됨 (현재 status의 값은 3)
- 옵저버는 getter를 통해서 주제의 status 값을 받아오기 때문에 status = 3을 두 번 출력
따라서 ‘주제의 상태는 계속 바뀌는 것을 가정하기 때문에’ 주제의 갱신된 값을 올바르게 가져오기 위해서는 push 방식보단 pull 방식이 더 나을 것 같다는 생각을 하였습니다.
여기에 대해서는 어떤 의견을 갖고 계시는지 궁금하며, 이와 비슷한 멀티스레드 환경에서도 똑같을지 궁금합니다!