To Be Developer

[Design Pattern] Observer Pattern (옵저버 패턴) 본문

Design Pattern

[Design Pattern] Observer Pattern (옵저버 패턴)

Jeff Hwang 2019. 4. 20. 23:46

Observer Pattern (감시자)

  • 객체지향 프로그래밍에서 객체에 감시자(Observer) 들을 등록을 하여 객체의 상태변화가 발생 하였을 때 자동으로 알리도록 설정하는 패턴
  • 주로 이용되는 곳이 유튜브와 같이 구독자 알림과 같은 곳에서 옵저버 패턴이 적용된다.
import abc

class Observer(object):
    __metaclass__ = abc.ABCMeta
    # 알림 역할을 하는 추상 메서드
    @abc.abstractmethod
    def notify(self, videos):
        pass

# 구독자 알림
class Subscriber(Observer):
    def __init__(self, subId):
        self.subId = subId

    def notify(self, video):
        print("{} 님 {} 영상 추가 되었습니다.".format(self.subId, video))


# 객체의 Super 클래스
class Subject(object):
    __metaclass__ = abc.ABCMeta
    @abc.abstractmethod
    def addSubscribe(self, subscriber):
        pass

    @abc.abstractmethod
    def delSubscribe(self, subscriber):
        pass

# 유튜브 채널
class YouTubeChannel(Subject):
    # 생성자
    def __init__(self, subscribers=[]):
        self.subscribers = subscribers
        self.videos = []

    # 구독자 추가
    def addSubscribe(self, subId):
        sub = Subscriber(subId)
        self.subscribers.append(sub)

    # 구독 취소
    def delSubscribe(self, subId):
        subs = len(self.subscribers)
        try:
            for sub in range(subs):
                if self.subscribers[sub].subId == subId:
                    self.subscribers.pop(sub)
                    print("{} 님의 구독이 취소 되었습니다.".format(subId))
                    break
        except:
            print('구독자가 없습니다.')

    # 영상 업로드
    def upLoadVideo(self, video):
        self.videos.append(video)
        for i in self.subscribers:
            i.notify(video)

if __name__ == "__main__":
     s = YouTubeChannel()
     s.addSubscribe("YoonHoo")
     s.addSubscribe("Hwang")
     s.addSubscribe("Jeff")

     s.upLoadVideo("배틀그라운드 플레이")
     s.delSubscribe("YoonHoo")
     s.upLoadVideo("리그오브레전드 플레이")
     s.delSubscribe("Jeff")

'Design Pattern' 카테고리의 다른 글

[Design Pattern] Singleton Pattern (싱글톤 패턴)  (0) 2019.04.22