용어 정리
Subject : 데이터(db)
Observer : subject에 관심을 가지고 사용하는 클래스 또는 컴포넌트
사용 용도 및 상황
- 각각의 observer들이 subject에 대한 알림에 대응해 서로 다른 행동을 취해야 할 때
- subject이 하나의 observer에 의해 변경되었을 때, 모든 observer들이 알림을 받아야 하고 그에 따른 업데이트를 진행해야 하는 경우
해결 방안
subject을 설계할 때 observer의 행동에 영향을 받지 않도록 설계해야한다. 모든 subject은 observers에 대해서 독립적이어야 한다.
Observer Pattern의 구조
Subject와 Observer 클래스는 추상클래스로서 각각 ConcreteSubject와 ConcreteObserver의 슈퍼클래스가 된다.
Subject
Subject은 Observer클래스를 관리한다. (-> 검은 화살표) Observer를 Subject에 추가하거나(Attach), 빼거나(Detach)하는 경우를 Subject의 메서드로 관리하고있다.
Notify를 사용하면 자신이 관리하는 Observer들의 Update 메소드를 호출한다.
Observer
ConcreteObserver에서 Update메서드가 실행이 된다면 자신을 관리해주는 subject의 GetState()메서드를 호출하게 된다. 따라서 자신과 연관된 Subject의 변경 사항을 업데이트 할 수 있다.
Subject을 통해서 Observer를 가리키게 하면 Subject은 Observer의 영향을 받지 않을 수 있고, Observer도 Subject의 변화를 빠르게 감지할 수 있는 장점이 있다. 그리고 Observer가 추가로 생기더라도 독립적으로 추가할 수 있는 확장성이 장점이 된다. 이러한 방식을 Observer Pattern이라고 부른다.