์์ฑ์ : ์ฅ์ฃผ์ญ
์ต์ ๋ฒ ํจํด(observer pattern)์ ๊ฐ์ฒด์ ์ํ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ ๊ด์ฐฐ์๋ค, ์ฆ ์ต์ ๋ฒ๋ค์ ๋ชฉ๋ก์ ๊ฐ์ฒด์ ๋ฑ๋กํ์ฌ ์ํ ๋ณํ๊ฐ ์์ ๋๋ง๋ค ๋ฉ์๋ ๋ฑ์ ํตํด ๊ฐ์ฒด๊ฐ ์ง์ ๋ชฉ๋ก์ ๊ฐ ์ต์ ๋ฒ์๊ฒ ํต์งํ๋๋ก ํ๋ ๋์์ธ ํจํด์ด๋ค. ์ฃผ๋ก ๋ถ์ฐ ์ด๋ฒคํธ ํธ๋ค๋ง ์์คํ ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ๋ฐํ/๊ตฌ๋ ๋ชจ๋ธ๋ก ์๋ ค์ ธ ์๊ธฐ๋ ํ๋ค.
์ถ์ฒ: wikipedia: ์ต์ ๋ฒ ํจํด
์ด ๋ง์ ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ํ์ด์ ์๊ธฐํ์๋ฉด Observerํจํด์ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฐ์ฒด ๋ฐ ์ธํฐํ์ด์ค๋ก Observable(์ฃผ์ฒด)๊ณผ Observer ๋ ๊ฐ์ง๊ฐ ์กด์ฌํ๋ค. ์ฌ๊ธฐ์ Observable๊ฐ์ฒด๋ ์ํ๊ฐ ๋ณํ ๋๋ ์ฃผ์ฒด์ด๊ณ ์ด๋ฌํ ์ฃผ์ฒด๋ฅผ ๊ด์ฐฐํ๊ณ ์๋ ๊ฒ์ด Observer์ด๋ค. Observable์ ํ๋ ๋๋ ์ฌ๋ฌ Observer๋ฅผ ๋ฑ๋กํ๊ฑฐ๋ ํด์ ํ ์ ์๊ณ ์ด๋ ํ ์ํ ๋ณํ์ Observer๋ค์ ์๋ฆด ์ ์๋ค. ๊ฐ๊ฐ์ Observer๋ค์ ์ด๋ฌํ ์ํ๋ณํ์ ๋ํด์ ์ ๋ฌ ๋ฐ์ผ๋ฉด ๊ฐ๊ฐ์ ์๋ง๋ ํ๋์ ์ํํ๋ค.
- ํ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ฌํญ์ ์ฐธ์กฐํ๊ณ ์๋ ๋ค๋ฅธ ๊ฐ์ฒด์์ ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ์ฌํญ์ ์ ํ ํ ์ ์๋ค.
- ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ์ ๊ฑฐํจ์ผ๋ก์จ ๋์จํ ๊ฒฐํฉ์ผ๋ก ์์คํ
์ด ์ ์ฐํด์ง๋ค.
- ์ต์ ๋ฒ๋ฅผ ์ธ์ ๋ ์๋ก ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ ๊ฐ๋ฅํ๋ค.
- ์๋ก์ด ํ์์ ์ต์ ๋ฒ๋ผ๋ Observable(์ฃผ์ฒด)๋ฅผ ๋ณ๊ฒฝํ ํ์ ์๋ค.
- Observable(์ฃผ์ฒด)์ Observer๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- observer๋ฅผ ํ์ํ ์์ ์ธ์ ์ ๊ฑฐํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ผ์ด๋ ์ ์๋ค.
- ๋๋ฌด ๋น๋ฒํ๊ฒ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ํ ๊ด๋ฆฌ๊ฐ ํ๋ค ์ ์๋ค.
Observer ํจํด์ ์ด์ฉํ Netflix๊ตฌ๋ ์์ ์ด๋ค.
NetflixUser(Observer)๋ Netflix(Observable)์ ์ํ ๋๋ ์ ๋๋ฉ์ด์ ์ด ์ ๋ฐ์ดํธ ๋๋ ๊ฒ์ ๊ด์ฐฐ ํ๊ณ ์๋ค. ๋ง์ฝ ์ํ ๋๋ ์ ๋๋ฉ์ด์ ์ด ์ ๋ฐ์ดํธ ๋๋ฉด Netflix(Observable)์ ์์ ์ ๊ตฌ๋ ํ๊ณ ์๋ NetflixUser(Observer)์๊ฒ ์๋ ค์ฃผ๊ณ NetflixUser(Observer)๋ ์ํ์ด๋ ์ ๋๋ฉ์ด์ ์ด๋์ ๋ฐ๋ผ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ก์ง์ ์ํํ๊ฒ ๋๋ค.
public class Netflix implements Observable {
// ๊ตฌ๋
ํ๊ณ ์๋ user ๋ฆฌ์คํธ
ArrayList<NetflixUser> userList;
public Netflix() {
this.userList = new ArrayList<NetflixUser>();
}
// movie๋ฅผ updateํด์ฃผ๊ณ ๊ตฌ๋
์ค์ธ ๊ตฌ๋
์์๊ฒ ์๋ฆผ
public void updateMovie(String movie){
// movie update code
notifyMovie(movie);
}
// animation์ updateํด์ฃผ๊ณ ๊ตฌ๋
์ค์ธ ๊ตฌ๋
์์๊ฒ ์๋ฆผ
public void updateAnimation(String animation){
// animation update code
notifyAnimation(animation);
}
// ๊ตฌ๋
์ ์ถ๊ฐ
@Override
public synchronized void addObserver(NetflixUser user) {
System.out.println(user.name + "๊ฐ Netflix๋ฅผ ๊ตฌ๋
ํ๊ธฐ ์์ํ์ต๋๋ค.");
userList.add(user);
}
// ๊ตฌ๋
์ ์ญ์
@Override
public synchronized void deleteObserver(NetflixUser user) {
System.out.println(user.name + "๊ฐ Netflix๋ฅผ ๊ตฌ๋
์ทจ์ํ์ต๋๋ค.");
userList.remove(user);
}
// Movie๊ฐ update๋์๋ค๊ณ ๊ตฌ๋
์๋ค์๊ฒ ์๋ฆผ
@Override
public void notifyMovie(String content) {
for (NetflixUser user : userList) {
user.updateMovie(content);
}
}
// Animation์ด update๋์๋ค๊ณ ๊ตฌ๋
์๋ค์๊ฒ ์๋ฆผ
@Override
public void notifyAnimation(String content) {
for (NetflixUser user : userList) {
user.updateAnimation(content);
}
}
}
public class NetflixUser implements Observer {
// ๊ตฌ๋
์ ์ด๋ฆ
public String name;
public NetflixUser(String name){
this.name = name;
}
// movie update์ ์๋ฆผ์ ๋ฐ์
@Override
public void updateMovie(String content) {
System.out.println(name+ " | ์ํ : " + content +"๊ฐ ์
๋ก๋ ๋์์ต๋๋ค.");
}
// animation update์ ์๋ฆผ์ ๋ฐ์
@Override
public void updateAnimation(String content) {
System.out.println(name+ " | ์ ๋๋ฉ์ด์
: " + content +"๊ฐ ์
๋ก๋ ๋์์ต๋๋ค.");
}
}
public class Main {
public static void main(String[] args) {
Netflix netflix = new Netflix();
NetflixUser user1 = new NetflixUser("user1");
NetflixUser user2 = new NetflixUser("user2");
NetflixUser user3 = new NetflixUser("user3");
// user1 ์ด ๊ตฌ๋
์ ์์ ํจ
netflix.addObserver(user1);
System.out.println("-------------------------------------------");
// netflix์ Dark Knight๊ฐ ์
๋ฐ์ดํธ ๋จ
netflix.updateMovie("Dark Knight");
System.out.println("-------------------------------------------");
// user2, user3 ๊ฐ ๊ตฌ๋
์ ์์ํจ
netflix.addObserver(user2);
netflix.addObserver(user3);
System.out.println("-------------------------------------------");
// netflix์ Shutter Island๊ฐ ์
๋ฐ์ดํธ ๋จ
netflix.updateMovie("Shutter Island");
System.out.println("-------------------------------------------");
// user3๊ฐ ๊ตฌ๋
์ ์ทจ์ํจ
netflix.deleteObserver(user3);
System.out.println("-------------------------------------------");
// netflix์ ์งฑ๊ตฌ๋ ๋ชป๋ง๋ ค14๊ฐ ์
๋ฐ์ดํธ ๋จ
netflix.updateAnimation("์งฑ๊ตฌ๋ ๋ชป๋ง๋ ค14");
}
}