๋ฐ์ํ
Observer Pattern
Observer๋ ๊ด์ฐฐํ๋ ์ฌ๋์ ์๋ฏธ์ ๋๋ค.
- Observer ํจํด์์๋ ๊ด์ฐฐ ๋์(Subject)์ ์ํ๊ฐ ๋ณํํ๋ฉด ๊ด์ฐฐ์(Observer)์๊ฒ ์๋ ค์ค๋๋ค.
- Obsever ํจํด์ ์ํ ๋ณํ์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ์ ํ ๋ ํจ๊ณผ์ ์ ๋๋ค.
์ด๋ ํ ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ฌ์ ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ผ๋ณด๋ ๊ฐ์์๋ค์ด ๋ฐ๋ก ๋ฐ์ํ ์ ์๋ Pattern ์ ๋๋ค.
-> Subscriber, Listener Pattern
Observer Pattern์ด ์๋ ๊ฒฝ์ฐ
- ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ฌ๋์ง ํ์ธํ๊ธฐ ์ํด 1์ด, 1๋ถ, 1์๊ฐ๋ง๋ค ํ์ธ์ ํด์ผํฉ๋๋ค.
- ์ด๋ฌํ ๋ฐฉ๋ฒ์ polling ์ด๋ผ๊ณ ํ์ฌ ํ์ ์๋ ๋ฆฌ์์ค ๋ญ๋น๊ฐ ์๊น๋๋ค.
- Polling ์ฃผ๊ธฐ๊ฐ 1์๊ฐ์ผ ๊ฒฝ์ฐ, 1์๊ฐ ์ด๋ด์ ์ด๋ฒคํธ ์ผ์ด๋๋ค๊ฐ ์ฌ๋ผ์ง๋ค๋ฉด ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ฌ๋์ง ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
Observer Pattern์ ์ฌ์ฉํ ๊ฒฝ์ฐ
๋ฒคํธ๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๋ Obsever๋ค์ด ๋ฐ๋ก ๋ฐ์์ ํฉ๋๋ค.
- Observer Pattern ์์
- ์์นจ์ ์๋์ด ์ธ๋ฆฌ๋ฉด ๊ฐ์กฑ ๊ตฌ์ฑ์๋ค์ด ๋ชจ๋ ์ผ์ด๋์ ์นจ๊ตฌ ์ ๋ฆฌ๋ฅผ ํ๊ณ ์์นจ ์์ฌ๋ฅผ ํ๋ค.
- ํ๋ฐฐ๊ฐ ๋์ฐฉํ๋ฉด ํ๊ด๋ฌธ ์์ผ๋ก ๋ฌ๋ ค ๊ฐ๋๋ค.
- ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๊ด๋ จ ํจ์๊ฐ ๋์ํฉ๋๋ค.
๋ชจ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, Obsever๋ค์ด ๋ฐ๋ก ๋ฐ์ํ๋ ํจํด์ ๋๋ค.
Observer Pattern ํด๋์ค ๊ตฌ์กฐ
- Observer class
- ์ด๋ฒคํธ ๊ฐ์ํ๋ Observer ์ ๋๋ค.
- Update(): ์ด๋ค ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ฌ์ ๋ ๋์ํ ํจ์ ์ ๋๋ค.
- Base class ์์๋ฐ๋ ์ค์ Observer์ธ Observer1, Observer2
- Event class
- Event ์์๋ ์ด๋ฅผ ๋ฐ๋ผ๋ณด๋ Observer๋ฅผ ์์ ํฉ๋๋ค.
- Observer Object์ reference๋ค์ ๋ฆฌ์คํธ๋ก ๋ณด๊ดํฉ๋๋ค.
- register(): ์ฌ๋ฌ Observer๋ค์ ๋ฆฌ์คํธ๋ก ์ถ๊ฐํ๋ ํจ์ํฉ๋๋ค.
- notfiy(): ์ด๋ค event๊ฐ ์ผ์ด๋ฌ์ ๋ ์์ ํ๊ณ ์๋ Observer๋ค์ Update() ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
Observer Pattern Example
๊ฐ์์ง, ๊ณ ์์ด๊ฐ Observer / ๋๋ฌผ์ ์ฃผ์ธ์ด Event๊ฐ ๋๋ ๊ตฌ์กฐ๋ฅผ ์์ฑํฉ๋๋ค.
(์ฃผ์ธ์ด ์ง์ด ๋ค์ด์ค๊ฑฐ๋ ์งํฉ๋ช ๋ น ๋ด๋ฆฌ๋ฉด ๋๋ฌผ๋ค์ด ๋ฐ์ํฉ๋๋ค.)
class Observer:
def update(self):
pass
class Cat(Observer):
def update(self):
print('meow')
class Dog(Observer):
def update(self):
print('bark')
Observer ํด๋์ค
- ์ด๋ฒคํธ๋ฅผ ๊ฐ์ํ๋ Base ํด๋์ค์ ๋๋ค.
- update() ๋ฉ์๋๋ ์ด๋ฒคํธ์ ๋ฐ์ํ๋ ํจ์์ ๋๋ค.
- Cat๊ณผ Dog ํด๋์ค๋ Observer ํด๋์ค๋ฅผ ์์๋ฐ์ต๋๋ค.
- Cat ํด๋์ค๋ update()์์ "meow"๋ผ๊ณ ๋ฐ์ํฉ๋๋ค.
- Dog ํด๋์ค๋ update()์์ "bark"๋ผ๊ณ ๋ฐ์ํฉ๋๋ค.
class Owner:
def __init__(self):
self.animals = []
def register(self, animal):
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()
# meow
# bark
- Owner, Cat, Dog ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- Owner์ cat๊ณผ dog์ register()๋ฅผ ์ด์ฉํ์ฌ ๋ฑ๋กํฉ๋๋ค.
- Owner๊ฐ notify()๋ฅผ ํตํด ์ ํธ๋ฅผ ๋ณด๋ด๋ฉด Owner๊ฐ ์์ ํ cat๊ณผ dog์ด ๋ฐ์ํฉ๋๋ค.
๋ฐ์ํ
'๐บ๏ธ Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] Mediator Pattern - ๋งค๋์์ดํฐ ํจํด (0) | 2024.06.10 |
---|---|
[Design Pattern] Visitor Pattern - ๋ฐฉ๋ฌธ์ ํจํด (0) | 2024.06.10 |
[Design Pattern] Memento Pattern - ๋ฉ๋ฉํ ํจํด (0) | 2024.06.09 |
[Design Pattern] Chain of Responsibility (0) | 2024.06.09 |
[Design Pattern] Command Pattern - ์ปค๋งจ๋ ํจํด (0) | 2024.06.09 |