728x90

옵저버 패턴(Observer Pattern)은

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

 

옵저버 패턴(Observer Pattern)을 설명하기에 앞서 신문사과 구독자와의 관계를 생각해보자.

 

구독자가 신문을 보고 싶으면 신문사에 구독 신청을 한다.

그러면 구독자로 남아 있는 동안에는 매일 신문을 받아 볼 수 있다.

그리고 신문을 더 이상 보고 싶지 않으면 구독 해지 신청을 하면 된다.

신문사가 영업을 하는 동안에는 개인 독자, 호텔, 항공사, 학교 등등 여러 곳에서 꾸준히 구독 신청 및 해지를 할 것이다.

 

이러한 신문사와 구독자와의 관계는 옵저버 패턴과 매우 유사하다.

여기서 신문사를 주제(Subject), 구독자를 옵저버(Observer)라고 부른다는 것을 일단 기억하자.

 

 

 

[그림1 : 옵저버 패턴의 작동방식 , URL : http://hewiki.heroengine.com/wiki/Observer_Pattern]

 

그림과 같이 Subject에서 정보가 갱신되면 Subject에 등록된 모든 Observer에게 데이터를 전송한다.

옵저버 패턴에서 상태를 저장하고 지배하는 것은 주제객체(Subject) 이므로 상태를 갖는 객체는 하나만 있으면 된다.

또한 데이터의 주인은 사실상 Subject 객체이고 옵저버 객체는 사실상 데이터가 갱신되기를 기다리는 입장이라는 특징이 있는데 이러한 구조는 여러 객체에서 동일한 데이터에 접근하는 것 보다 좀 더 깔끔한 객체지향 디자인을 만든다.

 

이러한 디자인은 두 객체 사이의 결합도를 느슨하게 만들 수 있고 이 말은 주제와 옵저버가 서로 상호작용을 하기는 하지만 서로에 대해 잘 모른다는 것을 의미한다.

따라서 새로운 형식의 옵저버를 추가하더라도 Subject를 전혀 변경할 필요도 없고, Subject와 Observer는 서로 독립적으로 재사용이 가능하다.

 

그럼 이러한 특징을 가진 옵저버 패턴을 구현하기 위해서는 어떻게 디자인해야 할까?

옵저버로 등록될 객체들의 항목은 모두 다를 수 있다.

DOG도 옵저버가 되길 원할 수 있고, Cat도 Duck도 모두 다른 객체이지만 Observer가 되기를 희망할 수 있다.

따라서 C++에서 옵저버는 공통된 인터페이스를 갖도록 구현해야하는데 나는 Observer라는 인터페이스 클래스를 만들고 이것을 상속받도록 하여 구현하였다.

 

 

 

 

 

 

Subject는 제각각 다른 속성을 가질 수 있는 옵저버에 대해서 알 필요가 없다.

오직 옵저버들이 공통된 인터페이스를 갖는다는 사실만 알면 충분하다.

그렇기 때문에 Subject 클래스는 공통된 인터페이스를 사용하는 부분과 새로운 옵저버를 등록, 해제하고 정보를 갱신하는 인터페이스만을 가지면 된다.


아래의 코드에서는 registerObserver(), removeObserver() 메서드를 통해 옵저버(구독자)를 등록, 해제하고 notifyObserver()를 통해 갱신된 정보를 전달한다.



 


 

 

코드를 보면 알겠지만 옵저버 패턴은 마치 신문사와 구독자의 비유처럼 등록, 해지할 수 있도록 짜여진 구조라는 것을 알 수 있다.

옵저버 패턴의 구조를 좀 더 쉽게 이해하기 위한 Dog, Cat, Duck의 이야기를 보며 포스팅을 마치겠다.

 

 

[출력 결과]



 

 

[출력 결과]

 

 

참고로 옵저버 패턴에는 위와 같이 Subject가 Observer에게 데이터를 전송하는 방식과 

각각의 Observer가 Subject의 포인터를 갖고 Observer가 데이터를 가져오는 방식​ 두 가지가 있다.

후자의 방식으로 사용하면 옵저버가 원할 때 좀더 유연하게 정보를 처리할 수 있다는 장점이 있지만 상대적으로 전자의 방식보다 결합도는 높아지게 된다.

 

 

 

 

 

자료에 첨부된 소스 코드는 디자인 패턴의 개념을 참고하여 C++로 구현한 것이므로 잘못된 점이 있을 수 있습니다.

문제점이 발견될 시 피드백 부탁드립니다.

 

[참고 문헌 : 에릭 프리먼, 서환수 역, Head First Design Patterns ]

 

728x90

'Algorithm' 카테고리의 다른 글

정렬 시간복잡도  (0) 2014.10.17
B트리  (0) 2014.10.17
quick sort  (0) 2014.10.17
bitonic sort  (0) 2014.10.17
topological sort  (0) 2014.10.17

+ Recent posts