Observer
Observer ํจํด์ ํ ๊ฐ์ฒด(Subject)์ ์ํ ๋ณํ์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ์ฒด(Observer)๋ค์ด ์๋์ผ๋ก ๊ฐฑ์ ๋๋๋ก ํ๋ 1:N ๊ด๊ณ๋ฅผ ๊ตฌ์ฑํ๋ ๋์์ธ ํจํด์ ๋๋ค.
+----------------------+
| Subject | <-- ์ํ ๋ณ๊ฒฝ์ ํต๋ณดํ๋ ๊ฐ์ฒด
+----------------------+
| + attach(o:Observer) |
| + detach(o:Observer) |
| + notifyObservers() |
+----------------------+
โ
โโโโโโโโโโโดโโโโโโโโโโ
โ ... โ 1:N ๊ด๊ณ
โ โ
+--------------+ +--------------+
| Observer | | Observer | <-- ์ํ ๋ณ๊ฒฝ์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด๋ค
+--------------+ +--------------+
| + update() | | + update() |
+--------------+ +--------------+
์ฆ, Subject์ Observer ๊ฐ์ ๋์จํ ๊ฒฐํฉ(loose coupling)์ ํตํด, ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์์ ๋ ์๋ ํด๋์ค์ ์ง์ ์์กดํ์ง ์๊ณ Observer๋ค์๊ฒ ๋ณ๊ฒฝ ์ฌ์ค์ ์๋ ค์ค ์ ์์ต๋๋ค.
How do code ?
// Observer ์ธํฐํ์ด์ค: Subject์ ์ํ ๋ณ๊ฒฝ์ ํต๋ณด๋ฐ๊ธฐ ์ํ ๋ฉ์๋ ์ ์
public interface Observer {
void update(String message);
}
// Subject ์ธํฐํ์ด์ค: Observer๋ฅผ ๊ด๋ฆฌํ๋ ๋ฉ์๋ ์ ์
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers();
}
// ConcreteSubject: ์ค์ ๋ก Observer๋ค์ ๊ด๋ฆฌํ๊ณ , ์ํ ๋ณ๊ฒฝ ์ ํต๋ณดํ๋ ํด๋์ค
public class ConcreteSubject implements Subject {
private final List<Observer> observers = new ArrayList<>();
private String message;
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(message);
}
}
// ์ํ ๋ณ๊ฒฝ ์ Observer๋ค์๊ฒ ํต๋ณด
public void setMessage(String message) {
this.message = message;
notifyObservers();
}
}
// ConcreteObserver: ์ํ ๋ณ๊ฒฝ์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ํด๋์ค
public class ConcreteObserver implements Observer {
private final String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + "์ด(๊ฐ) ์
๋ฐ์ดํธ ๋ฐ์: " + message);
}
}
Subject (Observable ๊ฐ์ฒด)
Observer๋ฅผ ๋ฑ๋ก(attach)ํ๊ฑฐ๋ ํด์ (detach)ํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ , ์ํ ๋ณ๊ฒฝ ์ ๋ชจ๋ Observer๋ค์๊ฒ ์๋ฆฌ๋ ์ญํ ์ ํฉ๋๋ค.
๋ด๋ถ ์ํ(์: ๋ฉ์์ง)๊ฐ ๋ณ๊ฒฝ๋๋ฉด
notifyObservers()
๋ฅผ ํธ์ถํ์ฌ ๋ฑ๋ก๋ Observer๋ค์๊ฒ ๋ณ๊ฒฝ ๋ด์ฉ์ ์ ๋ฌํฉ๋๋ค.
Observer
Subject๋ก๋ถํฐ ์ํ ๋ณ๊ฒฝ์ ํต๋ณด๋ฐ๊ธฐ ์ํ
update()
๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค.๊ฐ๊ฐ์ ConcreteObserver๋ ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ์์ ๋ง์ ๋ฐฉ์์ผ๋ก ์ํ ๋ณ๊ฒฝ์ ๋์ํฉ๋๋ค.
์ฅ์
Subject์ Observer ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ, ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅ ๋ฐ ์์ ํ ์ ์์ต๋๋ค.
ํ ๊ฐ์ฒด์ ์ํ ๋ณ๊ฒฝ์ด ์ฌ๋ฌ ๊ฐ์ฒด์ ์๋์ผ๋ก ๋ฐ์๋๋ฏ๋ก, ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ฝ์ต๋๋ค.
Last updated