옵저버 패턴은 주체 객체의 상태 변화가 있을 때, 이를 자동으로 등록된 옵저버 객체들에게 알리는 기법이다.
1. 정의
옵저버 패턴(Observer Pattern)은 행동 패턴(Behavioral Pattern) 중 하나로, 객체의 상태 변화가 있을 때, 그 상태를 관찰(Observer)하는 객체들에게 자동으로 알림을 보내는 디자인 패턴이다. 이 패턴은 주체(Subject) 객체와 옵저버(Observer) 객체 간의 관계를 정의하고, 주체 객체의 상태가 변경될 때 옵저버 객체들이 이를 자동으로 반영하도록 한다.
2. 예제 코드
public interface PubListener {
void add(SubListener 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 = 0; i < 5; i++) {
try {
Thread.sleep(1000);
System.out.println(".");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
// 구독자들에게 알림주기
for (SubListener sub : subList) {
sub.update(msg);
}
}
}
public interface SubListener {
void update(String msg);
}
public class Sub1 implements SubListener{
@Override
public void update(String msg) {
System.out.println("sub1이 받은 알림: " +msg);
}
}
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. 상품 들어옴 (가정)
String msg = "상품 들어왔다!";
// 4. notifyChange 호출
pub.notifyChange(msg);
}
}
3. 정리
PubListener
인터페이스- 주체 객체를 정의하는 인터페이스
Pub
클래스- 여러 옵저버들을 관리하는 주체 객체
subList
리스트에 옵저버들을 저장하고notifyChange()
메서드를 통해 알림을 전파한다.
SubListener
인터페이스- 옵저버 객체를 정의하는 인터페이스
Sub
클래스- 주체 객체의 상태에 반응하는 옵저버 객체
Pub
클래스에서 알림을 주면update()
메서드를 통해 알림을 수신한다.
App
클래스- 주체 객체
pub
와 옵저버 객체sub1
과sub2
를 생성한다. sub1
과sub2
를pub
에 등록한다.notifyChange()
메서드를 사용하여 출력을 통해 옵저버가 알림을 제대로 받았는지 확인한다.
Share article