[Design Pattern] Observer Pattern
Observer Pattern
ํ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ด ์์์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
์ํ๋ฅผ ๊ฐ์ง๋ ๊ฐ์ฒด(Subject) / ์ํ์ ๋ณ๊ฒฝ์ ๊ด์ฐฐํ๋ ๊ฐ์ฒด(Observer Object)
โ 1:N ๊ด๊ณ
์ฅ์
-
Loose coupling
subject์ observer๋ ์๋ก์ ์กด์ฌ๋ฅผ ์ ํ์๊ฐ ์๋ค. -
Scalability(ํ์ฅ์ฑ)
client-server ๊ตฌ์กฐ๋ณด๋ค ๋ ์ข์ ํ์ฅ์ฑ์ ๊ฐ๋๋ค.
Java Observable / Observer
Observable
private boolean changed = false;
private Vector<Observer> obs; //Observable์ ํ๋ ์ด์์ Observer๋ฅผ ๊ฐ๋๋ค.
์ธ์คํด์ค๊ฐ ๋ณ๊ฒฝ๋๋ฉด Observer์๊ฒ ์๋ ค์ค๋ค.
public void notifyObservers() {
notifyObservers(null);
}
public void notifyObservers(Object arg) {
Object[] arrLocal; //์์ ๋ฒํผ, ํ์ฌ Observer Vector์ ์ค๋
์ท
synchronized (this) {
if (!changed)
//(์ฃผ์) setChanged()๋ฅผ ํตํด changed๋ฅผ true๋ก ๋ฐ๊พธ์ง ์์ผ๋ฉด notify๋ ๋์ง ์๋๋ค.
return;
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
Observer (interface)
Observable ๊ฐ์ฒด์ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ Observer
void update(Observable o, Object arg);
Subject๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํธ์ถ๋๋ค.
o
: Observable ๊ฐ์ฒด
arg
: Oservable์ notifyObservers()์์ ์ ๋ฌ๋ argument
Observer Pattern vs. Broadcast Receiver
์๋๋ก์ด๋ ์ฑ์ด ๋ณด๋ด๊ฑฐ๋ ๋ฐ๋ Broadcast๋ Observer ํจํด๊ณผ ์ ์ฌํ๋ค.
ํ์ง๋ง Broadcast Receiver๋ Subject๋ฅผ ๋ชฐ๋ผ๋ broadcast message๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ ์ ์๋ค.
Observer Pattern vs. Event Listener
Observer์ update()
void update(Observable o, Object arg); // ๋ฐ์ดํฐ๊ฐ Object๋ก ์จ๋ค.
โ Subject ๋ณ๊ฒฝ ์ ๋ฐ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ํ์
์ด ์๋ค๋ฉด ๊ฐ๊ฐ์ ํ์
์ผ๋ก ๋ณํํด์ ์ฌ์ฉํด์ผ ํ๋ค.
์ฌ๋ฌ ํ์ ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ๋ผ๋ฉด
Event Listener๋ก ๊ตฌํํ๋ ๊ฒ์ด ๋ช
์์ ์ด๊ณ ๊น๋ํ๋ค!
Comments