[python] 옵저버 디자인 패턴
옵저버 디자인 패턴은 소프트웨어 개발에서 유용하게 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 객체간의 일대다 의존성 관계를 정의하여, 하나의 객체의 상태가 변경될 때, 의존하는 다른 객체들에게 자동으로 알림을 보낼 수 있는 기능을 제공합니다. 이로써 객체들 간의 결합도를 느슨하게 유지할 수 있으며, 확장 가능하고 재사용 가능한 코드를 작성할 수 있습니다.
패턴 구성 요소
옵저버 디자인 패턴은 다음과 같은 구성 요소로 이루어져 있습니다:
Subject
: 이벤트를 발생시키는 주체(Subject) 객체입니다. 상태의 변경을 추적하고, 옵저버들에게 알림을 보내는 기능을 제공합니다.Observer
: 주체(Subject) 객체의 상태 변화를 감지 및 처리하는 역할을 수행하는 객체입니다. 주체(Subject)의 알림을 수신하기 위해 특정 인터페이스를 구현합니다.ConcreteSubject
: Subject 인터페이스를 구현한 클래스입니다. 상태 변화를 추적하고, 옵저버들에게 알림을 보냅니다.ConcreteObserver
: Observer 인터페이스를 구현한 클래스입니다. Subject 객체의 상태 변화에 대한 알림을 받아 처리합니다.
예제 코드
# 주체 클래스
class Subject:
def __init__(self):
self.observers = []
self.state = None
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(self.state)
def set_state(self, state):
self.state = state
self.notify()
# 옵저버 클래스
class Observer:
def update(self, state):
pass
# 구체적인 주체 클래스
class ConcreteSubject(Subject):
def __init__(self):
super().__init__()
# 구체적인 옵저버 클래스
class ConcreteObserver(Observer):
def update(self, state):
print("Received new state:", state)
# 사용 예시
subject = ConcreteSubject()
observer1 = ConcreteObserver()
observer2 = ConcreteObserver()
observer3 = ConcreteObserver()
subject.attach(observer1)
subject.attach(observer2)
subject.set_state("State 1") # 출력: Received new state: State 1
subject.detach(observer2)
subject.attach(observer3)
subject.set_state("State 2") # 출력: Received new state: State 2, Received new state: State 2
결론
옵저버 디자인 패턴은 객체간의 의존성 관계를 효과적으로 관리하고, 느슨한 결합을 유지할 수 있는 방법 중 하나입니다. 이를 통해 애플리케이션의 유연성과 확장성을 높일 수 있으며, 재사용 가능한 코드를 작성할 수 있습니다. 사용 예시를 통해 옵저버 디자인 패턴의 기본 개념과 구현 방법을 이해할 수 있습니다.