본문 바로가기

Knowledge/Design Pattern

옵저버패턴 (Observer Pattern)


옵저버 패턴 (Observer Pattern)


한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고 자동으로 내용이 갱신되는 방식을 말한다.



》》 1 : N (다) 의 의존성으로 정의


》》 일방적 통지방식의 패턴


》》 주체는 특정 데이터를 감시하고 있다가 변화를 감지한다.




옵저버 객체는 언제든지 삭제, 추가가 가능하며 옵저버 객체에서 삭제가 되면 주체의 새로운 값을 받을 수 없게된다.


여기서 주체와 옵저버 객체는 느슨하게 결합되어있다.

느슨하게 결합되어있다는 것은 상호작용을 하긴 하지만 서로에 대해 잘 모른다는 것을 뜻한다.


》》 주체가 옵저버에 대해서 아는 것은 옵저버거 특정 인터페이스를 구현한다는 것뿐


》》 느슨하게 결합되어있는 디자인을 사용하면 변경사항이 생겨도 무난히 처리 가능


옵저버 패턴은 언제 사용될까?

한 객체의 변경으로 변경되어져야하는 객체 수가 많은 경우에 사용된다.

추후에 발생하는 유지 / 보수에 유용하다.


자바 내장 옵저버 패턴

옵저버 패턴을 직접 코딩해서 구현할 수 있지만 자바에서 API를 통해 지원하기도 한다.


하지만 JDK 내장 옵저버 패턴에는 몇가지 단점이 있다.


1. Observable은 클래스다

: 이말은 즉, 옵저버 기능을 추가하고자 하는 클래스가 이미 다른 클래스를 확장하고 있다면 그 클래스는

  Observable의 기능을 추가할 수 없다.


2. Observable 클래스의 핵심 메소드를 외부에서 호출할 수 없다.

: setChanged() 메소드 등이 접근 제한자가 protected로 선언되어 있다.

  이말은 즉, Observable의 서브클래스에서만 호출할 수 있다는 것을 뜻한다.

  이런 디자인은 상속보다 구성을 활용한다는 디자인 원칙에도 위배된다.


때에 따라 직접 구현하거나 자바 내장 옵저버 패턴을 사용한다. 중요한것은 제대로 이해하고 사용하는 것.