์ํ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฃผ์ฒด ๊ฐ์ฒด & ์ํ์ ๋ณ๊ฒฝ์ ์์์ผ ํ๋ ๊ด์ฐฐ ๊ฐ์ฒด
(1 ๋ 1 or 1 ๋ N ๊ด๊ณ)
์๋ก์ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ณผ์ ์์ ์ ๋ณด์ ๋จ์๊ฐ ํด์๋ก, ๊ฐ์ฒด๋ค์ ๊ท๋ชจ๊ฐ ํด์๋ก ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๊ฒ ๋๋ค. ์ด๋ ๊ฐ์ด๋๋ผ์ธ์ ์ ์ํด์ค ์ ์๋ ๊ฒ์ด '์ต์ ๋ฒ ํจํด'
์ก์ง์ฌ : ๊ตฌ๋
์
์ฐ์ ๋ฐฐ๋ฌ์
์ฒด : ๊ณ ๊ฐ
๊ตฌ๋ ์, ๊ณ ๊ฐ๋ค์ ์ ๋ณด๋ฅผ ์ป๊ฑฐ๋ ๋ฐ์์ผ ํ๋ ์ฃผ์ฒด์ ๊ด๊ณ๋ฅผ ํ์ฑํ๊ฒ ๋๋ค. ๊ด๊ณ๊ฐ ์ง์๋๋ค๊ฐ ์ ๋ณด๋ฅผ ์ํ์ง ์์ผ๋ฉด ํด์ ํ ์๋ ์๋ค. (์ก์ง ๊ตฌ๋ ์ ์ทจ์ํ๊ฑฐ๋ ์ฐ์ ๋ฐฐ๋ฌ์ ์ค์งํ๋ ๊ฒ์ฒ๋ผ)
์ด๋, ๊ฐ์ฒด์์ ๊ด๊ณ๋ฅผ ๋งบ๊ณ ๋๋ ์ํ ๋ณ๊ฒฝ ์ ๋ณด๋ฅผ Observer์ ์๋ ค์ค์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋งํ๋ค.
-
Observer๋ค์ ๊ด๋ฆฌํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์
์ต์ ๋ฒ ๋ฑ๋ก(add), ์ ์ธ(delete), ์ต์ ๋ฒ๋ค์๊ฒ ์ ๋ณด๋ฅผ ์๋ ค์ค(notifyObserver)
public interface Publisher { public void add(Observer observer); public void delete(Observer observer); public void notifyObserver(); }
-
์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธ(update)
public interface Observer { public void update(String title, String news); }
-
Publisher๋ฅผ ๊ตฌํํ ํด๋์ค๋ก, ์ ๋ณด๋ฅผ ์ ๊ณตํด์ฃผ๋ ํผ๋ธ๋ฆฌ์ ๊ฐ ๋จ
public class NewsMachine implements Publisher { private ArrayList<Observer> observers; private String title; private String news; public NewsMachine() { observers = new ArrayList<>(); } @Override public void add(Observer observer) { observers.add(observer); } @Override public void delete(Observer observer) { int index = observers.indexOf(observer); observers.remove(index); } @Override public void notifyObserver() { for(Observer observer : observers) { observer.update(title, news); } } public void setNewsInfo(String title, String news) { this.title = title; this.news = news; notifyObserver(); } public String getTitle() { return title; } public String getNews() { return news; } }
-
Observer๋ฅผ ๊ตฌํํ ํด๋์ค๋ค๋ก, notifyObserver()๋ฅผ ํธ์ถํ๋ฉด์ ์๋ ค์ค ๋๋ง๋ค Update๊ฐ ํธ์ถ๋จ
public class EventSubscriber implements Observer { private String newsString; private Publisher publisher; public EventSubscriber(Publisher publisher) { this.publisher = publisher; publisher.add(this); } @Override public void update(String title, String news) { newsString = title + " " + news; display(); } public void withdraw() { publisher.delete(this); } public void display() { System.out.println("์ด๋ฒคํธ ์ ์ "); System.out.println(newsString); } }
Java์๋ ์ต์ ๋ฒ ํจํด์ ์ ์ฉํ ๊ฒ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํด์ค
Observer ์ธํฐํ์ด์ค, Observable ํด๋์ค
ํ์ง๋ง Observable์ ํด๋์ค๋ก ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ ค๋ฉด ์์์ ํด์ผ ํจ. ๋ฐ๋ผ์ ๋ค๋ฅธ ์์์ ํจ๊ป ์ด์ฉํ ์ ์๋ ๋จ์ ์กด์ฌ
์ต์ ๋ฒ ํจํด์, ํ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ฐ๋๋ฉด ๊ทธ ๊ฐ์ฒด์ ์์กดํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์๊ฒ ์ฐ๋ฝ์ด ๊ฐ๊ณ , ์๋์ผ๋ก ์ ๋ณด๊ฐ ๊ฐฑ์ ๋๋ 1:N ๊ด๊ณ(ํน์ 1๋1)๋ฅผ ์ ์ํ๋ค.
์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฐ๊ฒฐํ์ฌ ๋์จํ ๊ฒฐํฉ์ฑ์ ์ ์งํ๋ฉฐ, Publisher์ Observer ์ธํฐํ์ด์ค๋ฅผ ์ ์ฉํ๋ค.
์๋๋ก์ด๋ ๊ฐ๋ฐ์, OnClickListener์ ๊ฐ์ ๊ฒ๋ค์ด ์ต์ ๋ฒ ํจํด์ด ์ ์ฉ๋ ๊ฒ (๋ฒํผ(Publisher)์ ํด๋ฆญํ์ ๋ ์ํ ๋ณํ๋ฅผ ์ต์ ๋ฒ์ธ OnClickListener๋ก ์๋ ค์ฃผ๋ก๋ ํจ)