์ต์ ๋ฒ ํจํด (Observer Pattern)
๊ฐ์ฒด์ ์ํ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ ์ต์ ๋ฒ๋ค์ ๋ฑ๋กํ๊ณ , ์ํ ๋ณํ๊ฐ ์์ ๋๋ง๋ค ๋ชจ๋ ์ต์ ๋ฒ๋ค์๊ฒ ์๋์ผ๋ก ํต์งํ์ฌ ์
๋ฐ์ดํธํ๋ ๋์์ธ ํจํด. ์ผ๋๋ค(one-to-many) ์์กด๊ด๊ณ๋ฅผ ์ ์ํ์ฌ ๋์จํ ๊ฒฐํฉ์ ๊ตฌํํ๋ค.
์ฃผ์ ๋ชฉ์
โข
๊ฐ์ฒด ๊ฐ์ ์ํ ๋ณํ๋ฅผ ์๋์ผ๋ก ์ ํ
โข
๋์จํ ๊ฒฐํฉ(Loose Coupling)์ ํตํ ์ ์ฐ์ฑ ํ๋ณด
โข
๋ณ๊ฒฝ์ฌํญ์ ์ฌ๋ฌ ๊ฐ์ฒด์ ์๋์ผ๋ก ์๋ฆผ
ํน์ง
โข
Subject(์ฃผ์ฒด)์ Observer(๊ด์ฐฐ์)๋ก ๊ตฌ์ฑ
โข
Observer๋ Subject์ ๋ฑ๋ก/ํด์ ๊ฐ๋ฅ
โข
Subject์ ์ํ ๋ณํ์ ๋ชจ๋ Observer์๊ฒ ํต์ง
โข
์ค์๊ฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์ ํฉ
์์ ์ฝ๋
// Subject ์ธํฐํ์ด์ค
interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers();
}
// Observer ์ธํฐํ์ด์ค
interface Observer {
void update(String message);
}
// ๊ตฌ์ฒด์ ์ธ Subject ํด๋์ค
class NewsAgency implements Subject {
private List<Observer> observers = new ArrayList<>();
private String news;
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for(Observer observer: observers) {
observer.update(news);
}
}
public void setNews(String news) {
this.news = news;
notifyObservers();
}
}
// ๊ตฌ์ฒด์ ์ธ Observer ํด๋์ค
class NewsChannel implements Observer {
private String name;
public NewsChannel(String name) {
this.name = name;
}
public void update(String news) {
System.out.println(name + " received news: " + news);
}
}
Java
๋ณต์ฌ
์ฝ๋ ์ค๋ช
์ ์์ ์ฝ๋๋ ๋ด์ค ์์ด์ ์์ ๋ด์ค ์ฑ๋ ๊ฐ์ ์ต์ ๋ฒ ํจํด ๊ตฌํ์ ๋ณด์ฌ์ค๋๋ค:
1. ์ธํฐํ์ด์ค ์ ์
โข
Subject ์ธํฐํ์ด์ค: ์ต์ ๋ฒ๋ฅผ ์ถ๊ฐ(attach)ํ๊ณ ์ ๊ฑฐ(detach)ํ๋ฉฐ, ๋ชจ๋ ์ต์ ๋ฒ์๊ฒ ํต์ง(notifyObservers)ํ๋ ๋ฉ์๋๋ฅผ ์ ์
โข
Observer ์ธํฐํ์ด์ค: ์ํ ๋ณํ๋ฅผ ํต์ง๋ฐ์ ๋ ํธ์ถ๋๋ update ๋ฉ์๋๋ฅผ ์ ์
2. NewsAgency (Subject) ํด๋์ค
โข
์ต์ ๋ฒ๋ค์ List๋ก ๊ด๋ฆฌ
โข
์๋ก์ด ๋ด์ค๊ฐ ์ค์ ๋๋ฉด(setNews) ์๋์ผ๋ก ๋ชจ๋ ์ต์ ๋ฒ์๊ฒ ํต์ง
โข
์ต์ ๋ฒ ์ถ๊ฐ/์ ๊ฑฐ ๊ธฐ๋ฅ ๊ตฌํ
3. NewsChannel (Observer) ํด๋์ค
โข
๊ฐ ์ฑ๋์ ๊ณ ์ ํ ์ด๋ฆ์ ๊ฐ์ง
โข
update ๋ฉ์๋๋ฅผ ํตํด ์๋ก์ด ๋ด์ค๋ฅผ ์ ๋ฌ๋ฐ์ ์ถ๋ ฅ
์ด ๊ตฌํ์ ํตํด ์๋ก์ด ๋ด์ค๊ฐ ๋ฐ์ํ ๋๋ง๋ค ๋ฑ๋ก๋ ๋ชจ๋ ๋ด์ค ์ฑ๋์ด ์๋์ผ๋ก ์
๋ฐ์ดํธ๋๋ ๋์จํ ๊ฒฐํฉ ๊ตฌ์กฐ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.