관찰자 패턴

지난 주에 Strategy 패턴에 대해 배웠고, 오늘은 Observer 패턴에 대해 알아볼 것입니다.

관찰자 패턴은 개체가 개체의 상태가 변경될 때 알림을 받는 여러 종속 항목(관찰자라고 할 수 있음)을 가질 수 있는 동작 디자인 패턴입니다.

우리가 알아야 할 몇 가지 용어는
  • 관찰자 - 알림을 받아야 하는 종속 항목
  • Observable - 관찰자에게 알릴 객체

  • 이 패턴의 실제 예는 잡지 회사 구독 서비스입니다. 잡지를 구독하고 있다고 가정해 보겠습니다. 여기에서 잡지 회사는 부양 가족(잡지를 구독하는 사람들) 목록을 가질 개체입니다. 새로운 잡지가 발행될 때마다 모든 구독자에게 발송됩니다.

    옵저버 패턴의 기술적인 예는 다음과 같습니다.
  • Model View Controller Pattern(여기서 View는 Observer를 나타내고 Model은 Observable을 나타냄)

  • Android의 LiveData
  • Facebook/Twitter와 같은 소셜 미디어 플랫폼에서 사람은 자신의 상태를 게시하거나 업데이트할 수 있으며 팔로워는 알림을 받습니다.

  • Python에서 이 패턴을 구현하는 방법을 살펴보겠습니다.

    class Subject(object):
        def __init__(self):
            self.observers = []
    
        def subscribe(self, observer):
            self.observers.append(observer)
    
        def unsubscribe(self, observer):
            self.observers.remove(observer)
    
        def notify(self, *args, **kwargs):
            for observer in self.observers:
                observer.notify(*args, **kwargs)
    
    class EmailSender(Subject):
        pass
    


    위의 코드에는 옵저버를 구독/구독 취소하는 메서드가 있는 Subject가 있습니다. 또한 notify 라는 메서드가 있습니다. 사용자가 구독자에게 이메일을 보내려고 할 때마다 이 메서드를 호출할 수 있습니다.

    Note that we have written the common code for observer pattern in a separate class called Subject . This is for reusability and for cleaner code.



    class EmailObserver(object):
        def __init__(self, email):
            self.to_address = email
    
        def notify(self):
            self.send_email()
    
        def send_email(self):
            print(f"Sending email to {self.to_address}")
    
    if __name__ == '__main__':
        email_sender = EmailSender()
        subscriber1 = EmailObserver("[email protected]")
        subscriber2 = EmailObserver("[email protected]")
    
        email_sender.subscribe(subscriber1)
        email_sender.subscribe(subscriber2)
        email_sender.notify()
    
        print("Unsubscribing subscriber1")
        email_sender.unsubscribe(subscriber1)
        email_sender.notify()
    


    위의 코드에서 Observer를 정의하고 EmailSender 구독했습니다.

    위의 코드는 다음을 출력합니다

    Sending email to abc@gmail.com
    Sending email to efg@gmail.com
    Unsubscribing subscriber1
    Sending email to efg@gmail.com
    

    좋은 웹페이지 즐겨찾기