옵저버 패턴 (Observer Pattern)
정의
- 뭔가 중요한 일(객체의 상태 변화)이 발생했을 때 객체들한테 새소식을 알려주는 패턴
Diagram Image
image
간단한 예
1 |
|
특징
- Subject 객체와 Observer 객체의 관계는 1 대 다 관계로 정의된다.
- Subject 객체와 Observer 객체는 느슨한 결합을 가지고 있다.
- Subject 객체에 변화가 생기면 객체를 관찰하는 모든 Observer 객체에 연락을 해야한다.
- Subject 객체는 관찰 하는 Observer들의 정보를 가지고 있어야한다.
- Subject 객체는 관찰 하는 Observer들의 정보를 추가, 삭제가 가능해야한다.
1 대 다 관계
- 옵저버 패턴은 1 대 다 의존성을 정의 한다.
- 옵저버 패턴에서 상태를 저장하고 지배 하는것은 Subject 객체이다.
따라서 상태가 들어있는 객체는 하나만 있을 수있습니다. - 옵저버가 상태를 사용하긴 하지만 반드시 상태를 가지고 있을 필요는 없다.
- 1개의 Subject 객체 여러개의 Observer 객체로 연관되기 때문에 1 대 다 관계가 성립됩니다.
느슨한 결합
- 디자인 패턴에서 말하는 느슨한 결합에 관하여 옵저버 패턴을 통하여 정의해보자
- 정의: 두 객체가 상호작용을 하긴 하지만 서로에 대해서 잘 모른다는것을 의미한다.
1 |
|
- 느슨하게 결합하는 디자인 패턴을 사용하면 추후에 변경사항이 생겨도 무난히 처리할수있다.
옵저버 패턴을 구현해 보자
1 |
|
Notify를 누가 호출해야할까?
- Notify() 호출을 누가 시켜야 할지 헷갈릴 수 있다.
- GoF는 다음 두 가지 방법 중에서 선택하라고 한다.
- Subject 에서 변경이 발생할 때, 변경을 저장하는 메소드가 Notify()를 호출하는 방법.
- 사용자(main 등)가 적절한 시기에 Notify()를 호출하는 방법.