옵저버 패턴은 객체들 간의 일대다(many-to-many) 관계를 정의하는 디자인 패턴이다. 이 패턴은 주체(subject)와 옵저버(observer)라는 두 가지 주요 요소로 구성되어 있다.
패턴 구성 요소
-
주체 (Subject): 주체는 상태나 데이터의 변경을 관찰하려는 옵저버들을 가지고 있는다. 주체의 주요 역할은 옵저버들을 등록, 제거하고, 변경 사항이 발생하면 옵저버들에게 알리는 것이다.
-
옵저버 (Observer): 옵저버는 주체의 상태나 데이터 변경을 관찰하며, 발생하는 이벤트에 대한 알림을 받는다. 옵저버는 주체에서 발생한 변경 사항에 대해 적절한 동작을 수행한다.
예제 코드
class Subject:
def __init__(self):
self.observers = []
def attach(self, observer):
self.observers.append(observer)
def detach(self, observer):
self.observers.remove(observer)
def notify(self):
for observer in self.observers:
observer.update()
class Observer:
def __init__(self, name):
self.name = name
def update(self):
print(f"{self.name} received notification")
# 주체 객체 생성
subject = Subject()
# 옵저버 객체 생성
observer1 = Observer("Observer 1")
observer2 = Observer("Observer 2")
observer3 = Observer("Observer 3")
# 옵저버 등록
subject.attach(observer1)
subject.attach(observer2)
subject.attach(observer3)
# 주체 객체의 상태 변경 알림
subject.notify()
# 출력:
# Observer 1 received notification
# Observer 2 received notification
# Observer 3 received notification
위의 예제 코드에서는 주체(Subject)와 옵저버(Observer)를 간단히 구현하였다. 주체는 옵저버들의 리스트를 관리하고, 옵저버에게 변경 사항을 알리는 역할을 한다. 옵저버는 주체에서 전달된 알림을 받아서 적절한 동작을 수행한다.
이 예제에서는 주체가 상태 변경을 알리는 notify
메서드를 호출하면, 등록된 모든 옵저버들이 알림을 받게 된다.
활용 예시
옵저버 패턴은 다양한 상황에서 활용될 수 있다. 예를 들어, 주식 시장에서 주가가 변동할 때, 주식 투자자들은 실시간으로 주식 가격 변동을 관찰하고자 할 수 있다. 이때, 주식 시장은 주식 투자자들을 옵저버로 등록하고, 주가 변동이 발생하면 등록된 옵저버들에게 알림을 전송하여 실시간으로 주식 가격 변동을 감지하도록 할 수 있다.
결론
옵저버 패턴은 객체 간의 관계를 유연하게 구성하여 상태나 데이터 변경을 감지하고 알림을 전송하는 디자인 패턴이다. 이 패턴을 활용하면 객체들 간의 결합도를 낮추고 유지보수성을 향상시킬 수 있다.