(디자인패턴 - 옵저버 패턴

Link copied to clipboard

옵저버 패턴

Link copied to clipboard
  • 한 객체의 상태가 바귀면 그 객체를 의존하는 다른 객체에 연락이 가고, 자동으로 내용이 갱신되는 일대다 의존성 정의
  • 어떤 주제와 이를 듣고 싶은 옵저버가 있을 때,
    • 주제가 변경될 때마다 옵저버에게 정보를 전달하고,
    • 정보가 변경된 것을 감지하면 옵저버는 주어진 행동을 함
  • 주제는 일반적으로 등록, 제거 메서드를 가짐

코드

Link copied to clipboard
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
  • abc를 상속받아서 주제와 옵저버 생성
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
  • 각 객체를 생성하여 실행
  • 지금 날씨, 통계가 모두 있을 때(또는 등록할 때), 날씨 데이터가 변경되면 해당하는 작업을 함
  • 옵저버를 제거하면, 추가적인 행동을 하지 않음

참조

Link copied to clipboard