옵서버 패턴
IT 위키
(Observer에서 넘어옴)
- 상위 문서: 소프트웨어 디자인 패턴
Observer Pattern
- 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 자동으로 통보되도록 하는 GoF 행위 패턴
일대다 의존 관계를 정의하되, 주체(Subject)와 관찰자(Observer)가 서로를 구체적으로 알지 않아도 되도록 느슨하게 결합시킨다. 발행-구독(Publish-Subscribe) 구조의 기본형이다.
| 역할 | 설명 |
|---|---|
| Subject | 관찰 대상. 옵서버 목록을 관리하고 등록·해제 메서드를 제공한다 |
| Observer | 통보를 받는 인터페이스. update() 를 정의한다 |
| ConcreteSubject | 실제 상태를 가지며, 상태가 바뀌면 notify() 로 옵서버들에게 알린다 |
| ConcreteObserver | 통보를 받아 자신의 상태를 갱신한다 |
- 옵서버가 Subject 에 자신을 등록한다.
- Subject 의 상태가 변한다.
- Subject 가 등록된 모든 옵서버의 update() 를 호출한다.
- 각 옵서버가 필요한 처리를 수행한다.
class Subject:
def __init__(self):
self.observers = []
def attach(self, observer):
self.observers.append(observer)
def notify(self, value):
for o in self.observers:
o.update(value)
class Display:
def __init__(self, name):
self.name = name
def update(self, value):
print(self.name, "received", value)
subject = Subject()
subject.attach(Display("A"))
subject.attach(Display("B"))
subject.notify(25)
- GUI 의 이벤트 리스너
- 데이터 변경에 따른 화면 자동 갱신 (MVC 의 모델-뷰 관계)
- 메시지 브로커의 구독 구조
옵서버가 많아지면 통보 비용이 커지고, 갱신 순서를 보장하지 않는다는 점에 유의한다.
