
Observer Pattern은 어떤 이벤트가 일어났을 때 이벤트를 바라보던 감시자들이 바로 반응할 수 있는 패턴이다.
이때, 이벤트가 일어났는지 확인하기 위해 1초, 1분, 1시간마다 확인을 해야한다.
이러한 방법을 polling이라고 하며 필요없는 리소스 낭비가 생긴다.
또한 Polling 주기가 1시간일 경우, 1시간 이내에 이벤트가 일어났다 사라진다면 이벤트가 일어났는지 알 수 있는 방법이 없다.

상태를 가지고 있는 ConcreteSubject 역할과 상태 변화를 전달받는 ConcreteObserver 역할이 있고, 이 두 가지의 역할을 연결하는 것이 API에 해당하는 Subject와 Observer입니다.
ConcreteSubject 클래스는 현재 자신을 관찰하고 있는 것이 어떤 관찰자인지 몰라도 상관이 없으나, 관찰자들이 동일한 Observer 인터페이스를 구현하고 있다는 것을 알고 있음 -> 등록된 Observer들에 대하여 update 메소드를 호출하는 것으로 내용을 알려줄 수 있습니다.
Subject는 복수의 Observer들이 등록되어 있습니다.
가령 notifyObserver 메소드에서는 먼저 등록된 Observer의 update 메소드가 먼저 호출됩니다.
일반적으로 구체관찰자 클래스를 설계할 때 update 메소드가 호출되는 순서가 변하더라도 문제가 일어나지 않도록 해야 합니다.
원래 각 클래스의 독립성이 보장되면 의존성의 혼란은 별로 발생하지 않는다.
강아지, 고양이가 Observer / 동물의 주인이 Event가 되는 구조 생성
(주인이 집에 들어오거나 집합명령 내리면 동물들이 반응)
# API
class Observer:
def update(self):
pass
class Cat(Observer):
def update(self):
print('meow')
class Dog(Observer):
def update(self):
print('bark')
# Example 1
class Owner: # Subject
def __init__(self):
self.animals = []
def register(self, animal: Observer):
self.animals.append(animal)
def notify(self):
for animal in self.animals:
animal.update()
owner = Owner()
cat = Cat()
dog = Dog()
owner.register(cat)
owner.register(dog)
owner.notify()