정의
객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때 마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴
주제와 옵저버 간의 일대다 관게를 형성, 주제의 상태 변화가 있을 때 모든 옵저버에게 자동으로 알림을 보내고 업데이트를 수행
옵저버 패턴 예제
public interface PubListener {
void add(SubListener sub);
void remove(SubListener sub);
void notifyChange(String msg);
}
public class Pub implements PubListener{
List<SubListener> subList = new ArrayList<>();
@Override
public void add(SubListener sub) {
subList.add(sub);
}
@Override
public void remove(SubListener sub) {
subList.remove(sub);
}
// 책임 : 물건이 들어오면, 구독자들에게 알림을 보낸다.
@Override
public void notifyChange(String msg) {
for(int i=1; i<6; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(".");
}
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. 객체 생성
PubListener pub = new Pub();
SubListener sub1 = new Sub1();
SubListener sub2 = new Sub2();
// 2. 구독하기
pub.add(sub1);
pub.add(sub2);
//3. 상품 들어옴(가정)
//4. notifyChange 호출
pub.notifyChange("상품 입고");
}
}
구성
- 주제(Subject): 상태를 관리하고, 옵저버 목록을 유지하며, 상태가 변경되면 옵저버들에게 알림
- 옵저버(Observer): 주제의 상태 변화를 감지하고, 그에 따른 행동을 수행
- 구체적인 주제(Concrete Subject): 주제의 구체적인 구현 클래스. 상태를 변경하고, 상태 변경 시 옵저버에게 알림
- 구체적인 옵저버(Concrete Observer): 옵저버의 구체적인 구현 클래스. 주제의 상태 변화를 감지하고, 그에 따라 필요한 행동 수행
장점
- 느슨한 결합: 주제와 옵저버 간의 결합도를 낮춤
- 유연성: 새로운 옵저버를 쉽게 추가
- 재사용성: 주제와 옵저버를 독립적으로 재사용
단점
- 복잡성 증가: 옵저버가 많아질수록 관리가 어려워짐
- 실시간성 보장 어려움: 모든 옵저버가 실시간으로 업데이트를 받을 수 있도록 보장 힘듬
풀링(Polling)
컴퓨터 과학에서 장치나 프로그램이 다른 장치나 프로그램의 상태를 주기적으로 검사하여 조건을 만족할 때 자료 처리를 하는 방식
푸시(Push)
서버가 데이터 변경 시 클라이언트에 직접 알림을 보내는 방식.
Share article