- Today
- Total
작심삼일
14주차-1. Observer 본문
디자인 패턴을 모르는 사람이 스터디를 하며 적은 것이라 틀린 부분이 있을 수 있습니다.
틀린 부분은 알려주시면 감사하겠습니다.
어떤 패턴인가
객체 사이에 일 대 다의 의존 관계를 정의해 두어, 어떤 객체의 상태가 변할 때 그 객체에 의존성을 가진 다른 객체들이 그 변화를 통지받고 자동으로 갱신될 수 있게 만듭니다.
어떻게 쓰는가
Subject: 감시자들을 알고 있는 주체. 감시자 객체를 붙이거나 떼는 데 필요한 인터페이스 제공
Observer: 주체에 생긴 변화에 관심 있는 객체를 갱신하는 데 필요한 인터페이스를 정의
ConcreteSubject: ConvreteObserver 객체에게 알려주어야 하는 상태를 저장. 상태가 변경될 때 감시자에게 알림
ConcreteObserver: ConcreteSubject 객체에 대한 참조자를 관리. 주체의 상태와 일관성을 유지해야 하는 상태를 저장
class Subject:
def __init__(self):
self.subscriber = []
self.msg = ""
def notify(self, msg):
for sub in self.subscriber:
sub.msg = msg
sub.update()
def register(self, observer):
self.subscriber.append(observer)
def unregister(self, observer):
self.subscriber.remove(observer)
class Observer:
def __init__(self):
msg = ""
def update(self):
print(self.msg)
-------------------------------------------------------
a = Observer()
b = Observer()
sub = Subject()
sub.register(a)
sub.register(b)
ob.notify('!!notification!!')
어디서 활용되는가
이는 책의 내용 (p. 383)을 그대로 가져왔다.
1. 어떤 추상 개념이 두 가지 양상을 갖고 하나가 다른 하나에 종속적일 때, 각 양상을 별도의 객체로 캡슐화하여 이들 각각을 재사용할 수 있다.
2. 한 객체에 가해진 변경으로 다른 객체를 변경해야 하고, 프로그래머들은 얼마나 많은 객체들이 변경되어야 하는지 몰라도 될 때
3. 어떤 객체가 다른 객체에 자신의 변화를 통보할 수 있는데, 그 변화에 관심 있어 하는 객체들이 누구인지에 대한 가정 없이도 그러한 통보가 될 때
구독/구독 취소 과정에서 유의해야할 점은 무엇인가?
1. 주체와 그것의 감시자를 대응시킨다.
만약 주체가 많고 감시자가 적다면 모든 주체들마다 감시자에 대한 참고자를 가지고 있기 때문에 저장 공간의 낭비가 심함
별도의 탐색용 자료 구조를 두고 주체와 감시자 간의 대응 관계를 관리하게 함
하지만 그렇게 되면 별도의 객체를 통해서 감시자에 대한 참조자를 얻어야 하는 단점 발생
2. 하나 이상의 주체를 감시
3. 누가 갱신을 trigger할 것인가?
1) Subject의 상태 변경 후 Notify() 호출: 사용자가 Notify() 호출할 필요 X / 여러 번 수정해야 하기 때문에 비효율적
2) 사용자가 Notify() 호출: 사용자가 원할 때 갱신하기 때문에 불필요한 수정이 일어나지 않음 / 사용자에게 수정하게 하는 추가적 행동을 정의해야 함 $\rightarrow$ 오류가 많아질 수 있음
4. 삭제한 주체에 대한 무효(dangling) 참조자를 계속 유지할 때가 있음
5. 통보 전에 주체의 상태가 자체 일관성을 갖추도록 함
6. 감시자별 갱신 프로토콜 피하기
My Opinion
바뀌면 안되는 객체를 감시할 때 사용하기 좋은 패턴이다..
나는 잘 사용하지 않을 것 같지만, 종종 사용하는 사람들이 있을 것이라 예상된다.
'스터디 > 디자인 패턴' 카테고리의 다른 글
15주차. Proxy (0) | 2021.09.30 |
---|---|
14주차-2. Bridge (0) | 2021.09.23 |
13주차. Mediator (0) | 2021.09.09 |
12주차. Facade (0) | 2021.08.18 |
11주차. Builder (0) | 2021.08.11 |