본문 바로가기

Design Patterns

Observer Pattern ① 개요

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
지난번 Strategy Pattern에서는 상속과 구현을 이용한 클래스 설계 후에 그것을 리팩토링 하면서 해나가면서 배우는 디자인 패턴이었다면, 이번에는 다른 방법으로 접근을 해보겠습니다.

먼저 Observer Pattern을 간단하게 그림과 함께 알아보도록 하겠습니다.

사용자 삽입 이미지

유후군 잇힝리라는 마을이 있다고 가정을 합시다. 잇힝리에 사는 현씨네 큰 아들이 장가를 간다고 이장님이 이 동네사는 현아네, 윤주네, 범석이네 식구들에게 방송으로 이 경사스러운 소식을 알렸습니다. 그렇지만 잇힝리에 살지 않는 한산이네까지는 방송이 되지 않았습니다.


옵저버 패턴은 이와 같이 동네 이장님이 동네 사람들에게 어떤 소식을 알리는 것과 같은 것을 비유해서 알고 있으면 기억하기가 쉽습니다. 보통 유식한 말로 이렇게 이야기 합니다.

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

다시말하면 여기서 한 객체의 상태가 바뀐다는 것은 현씨네 큰 아들이 총각에서 유부남이 되었다는 것이고 그 객체에 의존하는 다른 객체들은 현씨네 큰 아들을 알고 지내던 동네 주민들입니다. 연락을 하는 것은 이장님이 되겠고 내용이 갱신되는 것은 그전에 현씨네 큰아들이 총각이란걸 알고 있던 동네 주민들의 생각이 유부남으로 바뀌게 되는거겠지요!

위 그림에서 한산이네집 같은 경우에는 잇힝리가 아니기 때문에 이장님이 방송을 하더라도 방송 내용이 전달 되지 않습니다, 하지만 한산이네집이 잇힝리로 이사를 가게 되면 방송 내용을 듣게 될것이고, 또 잇힝리에 살던 범석이네가 다른 동네로 이사를 가면 또 방송 내용을 들을 수 없게 되겠죠.




이제는 클래스 다이어그램으로 한번 알아보도록 하겠습니다.

사용자 삽입 이미지

옵저버 패턴을 간단하게 보여주는 다이어 그램 입니다. 굉장히 간결하지요? 여기서 Subject와 Observer는 인터페이스 입니다. Subject는 Observer들을 여럿 가질 수 있습니다. 위의 예시를 들자면, 방송을 하시는 이장님은 여러사람에게 소식을 알릴 수 있습니다. ConcreteSubject 클래스는 상태를 설정하여 모든 Observer로 하여금 update()를 호출하게끔 push해주는 setState()와 Observer 객체가 직접 필요한 상태 정보를 pull(가져오는)하는getState() 메소드가 있습니다. 모든 Observer 객체들은 Subject의 상태를 가지고 있습니다.

이렇게 설명하면 정말 무슨소린지 알려고 해도 알 수가 없습니다. 이럴때는 역시 소스코드가 최고죠..
다음에 소스코드를 활용해서 옵저버 패턴에 대해서 알아보도록 하겠습니다.