설계패턴 24. Observer Pattern

LSDrug·2024년 6월 13일

설계패턴(完)

목록 보기
24/26

1. 정의

  • Observer는 관찰하는 사람의 의미이다.
  • Observer 패턴에서는 관찰 대상의 상태가 변화하면 관찰자에게 알려준다.
  • Observer 패턴은 상태 변화에 따른 처리를 기술할 때 효과적이다.

Observer Pattern은 어떤 이벤트가 일어났을 때 이벤트를 바라보던 감시자들이 바로 반응할 수 있는 패턴이다.

이때, 이벤트가 일어났는지 확인하기 위해 1초, 1분, 1시간마다 확인을 해야한다.

이러한 방법을 polling이라고 하며 필요없는 리소스 낭비가 생긴다.

또한 Polling 주기가 1시간일 경우, 1시간 이내에 이벤트가 일어났다 사라진다면 이벤트가 일어났는지 알 수 있는 방법이 없다.

2. 개념확장

교환 가능성

상태를 가지고 있는 ConcreteSubject 역할과 상태 변화를 전달받는 ConcreteObserver 역할이 있고, 이 두 가지의 역할을 연결하는 것이 API에 해당하는 Subject와 Observer입니다.

ConcreteSubject 클래스는 현재 자신을 관찰하고 있는 것이 어떤 관찰자인지 몰라도 상관이 없으나, 관찰자들이 동일한 Observer 인터페이스를 구현하고 있다는 것을 알고 있음 -> 등록된 Observer들에 대하여 update 메소드를 호출하는 것으로 내용을 알려줄 수 있습니다.

Observer에게 알림 순서

Subject는 복수의 Observer들이 등록되어 있습니다.
가령 notifyObserver 메소드에서는 먼저 등록된 Observer의 update 메소드가 먼저 호출됩니다.

일반적으로 구체관찰자 클래스를 설계할 때 update 메소드가 호출되는 순서가 변하더라도 문제가 일어나지 않도록 해야 합니다.

원래 각 클래스의 독립성이 보장되면 의존성의 혼란은 별로 발생하지 않는다.

3. 예시

강아지, 고양이가 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()

profile
마약같은 코딩, 마약같은 코딩러

0개의 댓글