(디자인패턴 - 옵저버 패턴
옵저버 패턴
- 한 객체의 상태가 바귀면 그 객체를 의존하는 다른 객체에 연락이 가고, 자동으로 내용이 갱신되는 일대다 의존성 정의
- 어떤 주제와 이를 듣고 싶은 옵저버가 있을 때,
- 주제가 변경될 때마다 옵저버에게 정보를 전달하고,
- 정보가 변경된 것을 감지하면 옵저버는 주어진 행동을 함
- 주제는 일반적으로 등록, 제거 메서드를 가짐
코드
import abc
class Subject:
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def register_observer(self):
pass
@abc.abstractmethod
def remove_observer(self):
pass
@abc.abstractmethod
def notify_observer(self):
pass
class Observer:
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def update(self):
pass
class WeatherData(Subject):
def __init__(self):
self.observers = []
self.temperature = 0
self.humidity = 0
self.pressure = 0
def register_observer(self, observer):
self.observers.append(observer)
def remove_observer(self, observer):
self.observers.remove(observer)
def notify_observer(self):
for observer in self.observers:
observer.update(self.temperature, self.humidity, self.pressure)
def get_temperature(self):
return self.temperature
def get_humidity(self):
return self.humidity
def get_pressure(self):
return self.pressure
def measurements_changed(self):
self.notify_observer()
def set_measurements(self, temperature, humidity, pressure):
self.temperature = temperature
self.humidity = humidity
self.pressure = pressure
self.measurements_changed()
class CurrentCondition(Observer):
def __init__(self, subject):
self.subject = subject
self.subject.register_observer(self)
def update(self, temperature, humidity, pressure):
self.temperature = temperature
self.humidity = humidity
self.pressure = pressure
self.display()
def remove(self):
self.subject.remove_observer(self)
def display(self):
print(F"Currnet condition temp: {self.temperature} hum: {self.humidity} pressure: {self.pressure}")
class StaticsDisplay(Observer):
def __init__(self, subject):
self.subject = subject
self.subject.register_observer(self)
def update(self, temperature, humidity, pressure):
self.temperature = temperature
self.humidity = humidity
self.pressure = pressure
self.display()
def remove(self):
self.subject.remove_observer(self)
def display(self):
print(F"Statics display temp: {self.temperature} hum: {self.humidity} pressure: {self.pressure}")
weather_data = WeatherData()
current_condition = CurrentCondition(weather_data)
statics_display = StaticsDisplay(weather_data)
weather_data.set_measurements(10, 50, 30)
# Currnet condition temp: 10 hum: 50 pressure: 30
# Statics display temp: 10 hum: 50 pressure: 30
weather_data.set_measurements(20, 60, 40)
# Currnet condition temp: 20 hum: 60 pressure: 40
# Statics display temp: 20 hum: 60 pressure: 40
statics_display.remove()
weather_data.set_measurements(15, 30, 60)
# Currnet condition temp: 15 hum: 30 pressure: 60
- 각 객체를 생성하여 실행
- 지금 날씨, 통계가 모두 있을 때(또는 등록할 때), 날씨 데이터가 변경되면 해당하는 작업을 함
- 옵저버를 제거하면, 추가적인 행동을 하지 않음
참조