https://thebook.io/080326/0020/
1. 옵저버패턴의 정의
2. 옵저버패턴 구현
3. 옵저버패턴의 장점
4. 옵저버패턴의 사용
5. 옵저버패턴의 단점
옵저버 패턴과 MVC패턴
MVC 패턴은 옵저버 패턴 + 미디에이터 패턴이라고 한다. 유의해서 보기!
주체가 어떤 객체(subject)의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다.
여기서주체
란 객체의 상태 변화를 보고 있는 관찰자이며, 옵저버들이란 이 객체의 상태 변화에 따라 전달되는 메서드 등을 기반으로 '추가 변화 사항'이 생기는 객체들을 의미한다.
observe : 관찰하다
어떤 객체의 상태가 변할 때, 그와 연관된 객체들에게 알림을 보내는 디자인 패턴
public interface Coach {
void subscribe(Crew crew);
void unsubscribe(Crew crew);
void notifyCrew(String msg);
}
public interface Crew {
void update(String msg);
}
public class Baedi implements Coach {
private List<Crew> crews = new ArrayList<>();
public void eatFood() {
System.out.println("Baedi eats Food");
notifyCrew("I eat food");
}
public void runaway() {
System.out.println("Baedi runs away");
notifyCrew("I run away");
}
public void upgradeCutie() {
System.out.println("베디코치가 귀여움을 강화했다");
notifyCrew("나 더 귀여워졌따");
}
@Override
public void subscribe(Crew crew) {
crews.add(crew);
}
@Override
public void unsubscribe(Crew crew) {
crews.remove(crew);
}
@Override
public void notifyCrew(String msg) {
crews.forEach(crew -> crew.update(msg));
}
}
public class Tiber implements Crew {
@Override
public void update(String msg) {
System.out.println("Tiber 수신 : " +msg);
}
}
// lewin, jay 도 Tiber와 같음
public class Main{
Baedi baedi - new Baedi();
Crew lewin = new Lewin();
Crew tiber = new Tiber();
Crew jay = new Jay();
baedi.subscribe(lewin);
baedi.subscribe(tiber);
baedi.subscribe(jay);l
baedi.upgradeCutie();
// 베디코치가 귀여움을 강화했다
// Lewin 수신 : 나 더 귀여워 졌따
// Tiber
// Jay
}
유연한 객체 지향 시스템 구축 - 객체 간 결합도가 낮기 때문에, 변경사항이 생겨도 복잡하지 않게 처리 가능
개방 폐쇄 원칙 가능
앞서 언급한 것처럼
MVC 패턴
에서 사용된다