옵저버 패턴(Observer Pattern)

정의
한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로
일대다(one-to-many)의존성을 정의 합니다.

느스한 결합(Loose coupling)
두 객체가 느슨하게 결합되어 있다는 것은, 그 둘이 상호작용을 하긴 하지만 서로에 대해 서로 잘 모르다는 것을 의미
옵저버 패턴에서는 주제와 옵저버가 느슨하게 결합되어 있는 객체 디자인을 제공합니다.

주제가 옵저버에 대해서는 아는 것은 옵저버가 특정 인터페이스(Observer 인터페이스)를 구현 한다는 것 뿐입니다.
- 옵저버는 언제든지 새로 추가할 수 있습니다.
- 새로운 형식의 옵저버를 추가 하려고 할 때도 주제를 전혀 변경할 필요가 없습니다.
- 주제와 옵저버는 서로 독립적으로 재사용할 수 있습니다.
- 주제나 옵저버가 바뀌더라도 서로한테 영향을 미치지는 않습니다.

디자인 원칙
1. 애플리케이션에서 바뀌는 부분을 찾아내서 바뀌지 않는 부분으로부터 분리 시킨다.
    -> 옵저버 패턴에서 변하는 것은 주제의 상태와 옵저버의 개수, 형식 입니다.
        옵저버 패턴에서는 주제를 바꾸지 않고도 주제의 상태에 의존하는 객체들을 바꿀수 있습니다.

2. 특정 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.
    -> Subject 와 Observer 에서 모두 인터페이스를 사용했습니다.
        Subject에서는 Subject 인터페이스를 통해서 Observer 인터페이스를 구현하는 객체들의 등록/탈퇴를 관리하고
        그런 객체들한테 연락을 돌리지요. 이렇게 함으로써 결합을 느슨하게 만들 수 있습니다.

3. 상속보다는 구성을 활용한다.
    -> 옵저버 패턴에서는 구성을 활용하여, 옵저버들을 관리 합니다. 주제와 옵저버 사이의 관계는 상속이 아니라 구성에
        의해서 이루어지니까요.

4. 서로 상효작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
    -> 느슨하게 결합하는 디자인을 사용하면 변경 사항이 생겨도 무난히 처리할 수 있는 유연한 객체지향 시스템을
        구축할 수 있습니다. 객체 사이의 상호의존성을 최소화할 수 있기 때문이죠

핵심 정리
- 옵저버 패턴에서는 객체들 사이에 일대다 관계를 정의합니다.
- 주제, 또는 Observable 객체는 동일한 인터페이스를 써서 옵저버에 연락을 합니다.
- Observable에서는 옵저버들이 Observer 인터페이스를 구현한다는 것을 제외하면 옵저버에 대해 전혀 모르기 때문에, 이들 사이의 결합은 느슨한 결합입니다.
- 옵저버 패턴을 이용하면 주제객체에서 데이터를 보내거나(푸시 방식) 옵저버가 데이터를 가져오는(풀 방식)을 쓸 수 있습니다. (풀 방식이 더 "옳은" 것으로 간주됩니다.)
- 옵저버들한테 연락을 돌리는 순서에 절대로 의존하면 안 됩니다.
- 자바에는 범용으로 쓸 수 있는 java.util.Observable을 비롯하여 옵저버 패턴을 구현한 것들이 여럿 있습니다.
- java.util.Obseervable의 몇가지 문제점에 주의합시다.
- 필요하면 언제든지 주저하지 말고 Observable 클래스에 상응하는 클래스를 직접 구현해 봅시다.
- 스윙 및 여러 GUI 프레임워크에서 옵저버 패턴이 많이 쓰입니다.
- 옵저버 패턴은 JavaBeans나 RMI를 비롯하여, GUI가 아닌 다른 부분에서도 광범위하게 쓰입니다.


고민할 문제)
Observer Pattern 에서 데이터를 Pull 과 Push 방식이 존재 한다. 각각 장단점을 고민해 보세요.
느슨한 결합이 되지 않는다면 어떤 식으로 바꾸어야 느슨한 결합을 유지 할 수 있을까요?

Posted by outliers
,