Search

์˜ต์ €๋ฒ„ ํŒจํ„ด

์˜ต์ €๋ฒ„ ํŒจํ„ด (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 ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋‰ด์Šค๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์ถœ๋ ฅ
์ด ๊ตฌํ˜„์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋‰ด์Šค๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋“ฑ๋ก๋œ ๋ชจ๋“  ๋‰ด์Šค ์ฑ„๋„์ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋Š์Šจํ•œ ๊ฒฐํ•ฉ ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.