객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴
1. 주요 개념
- 주체(Subject): 상태를 관리하며, 옵저버를 등록하고 제거하는 메서드를 제공합니다. 상태가 변경되면 모든 등록된 옵저버들에게 알립니다.
- 옵저버(Observer): 주체의 상태 변화를 감지하고, 그에 따라 동작을 수행하는 객체입니다. 주체로부터 통보를 받기 위한 인터페이스를 구현합니다.
2. 소스 코드 예시
- 영상 채널을 구독한 사람에게 채널에 영상이 올라오면 알림을 주는 애플리케이션
1) 구독자 (Subscriber) → 옵저버
public interface SubListener {
void update(String msg);
}
public class Sub1 implements SubListener {
@Override
public void update(String msg) {
System.out.println("sub1이 받은 알림 : " + msg);
}
}
2) 퍼블리셔 (Publisher) → 주체(Subject)
public interface PubListener {
// 컬렉션(구독한 유저 리스트)에 sub 등록
void add(SubListener sub);
// 컬렉션에서 sub 삭제
void remove(SubListener sub);
// 구독자 모두에게 메세지 보내기(구독 채널에 영상이 올라왔을 때)
void notifyChange(String msg);
}
public class Pub implements PubListener {
// 1. 구독자 명단
List<SubListener> subList = new ArrayList<>();
@Override
public void add(SubListener sub) {
subList.add(sub);
}
@Override
public void remove(SubListener sub) {
subList.remove(sub);
}
// 2. 책이 : 영상이 업로드되면, 구독자들에게 알림을 보낸다.
@Override
public void notifyChange(String msg) {
// 5초 대기
for (int i = 1; i < 6; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.print(".");
}
// 구독자들에게 알림주기
for (SubListener sub : subList) {
sub.update(msg);
}
}
}
- 구독자 명단 subList → 상태를 기록해둔 객체
3) Application
public class App {
public static void main(String[] args) {
// 1. 객체 생성 init (필요한 객체를 모두 메모리에 로드)
PubListener pub = new Pub();
SubListener sub1 = new Sub1();
SubListener sub2 = new Sub2();
// 2. 구독하기
pub.add(sub1);
pub.add(sub2);
// 3. 채널에 영상 업로드 (가정)
// 4. notifyChange 호출(영상이 올라왔을 때)
pub.notifyChange("영상 올라왔어!!");
}
}
Share article