옵저버 패턴이란?
옵저버 패턴은 주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메소드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다.
주체(객체)와 옵저버
public interface ISubject {
public void registerObserver(IObserver observer);
public void removeObserver(IObserver observer);
public void notifyObservers();
public Object getUpdate(IObserver observer);
}
public interface IObserver {
void update();
}
public class ConcreteSubject implements ISubject {
private List<IObserver> observers;
private String message;
public ConcreteSubject() {
this.observers = new ArrayList<>();
this.message = "";
}
@Override
public void registerObserver(IObserver observer) {
if (!observers.contains(observer)) {
observers.add(observer);
}
}
@Override
public void removeObserver(IObserver observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
this.observers.forEach(IObserver::update);
}
@Override
public Object getUpdate(IObserver observer) {
return this.message;
}
public void postMessage(String message) {
System.out.println("Message: " + message);
this.message = message;
notifyObservers();
}
}
public class Subscriber implements IObserver {
private String name;
private ConcreteSubject subject;
public Subscriber(String name, ConcreteSubject subject) {
this.name = name;
this.subject = subject;
}
@Override
public void update() {
String message = (String) subject.getUpdate(this);
System.out.println(name + ":: got message >> " + message);
}
}
위에 코드에서는 주체와 객체가 같다.
주체 ISubject 인터페이스를 ConcreteSubject로 구현했고, 그 클래스에 이 주체를 구독하고 있는 observers 리스트와 옵저버들에게 전달한 message를 선언했다.
메소드는 아래와 같이 정의했다.
- registerObserver() : 옵저버가 이 주체를 구독
- removeObserver() : 옵저버의 구독을 해제
- notifyObserver() : 이 주체를 구독하고 있는 옵저버들에게 메시지를 전달
- getUpdate() : 변경사항을 메시지에 갱신
옵저버 IObserver를 구현한 Subscriber에는 이름 name과 구독하고 있는 주체 subject를 선언했다.
메소드는 아래와 같이 정의했다.
- update() : 주체로부터 어떤 메시지를 옵저버가 받았는지 저장 및 출력
옵저버 패턴의 장점
- 변화에 유연하게 대응 가능
- 새로운 옵저버를 추가해도 기존의 주체(객체)를 수정할 필요 없음
- 동적으로 옵저버를 등록하거나 제거할 수 있음(OCP 만족)
- 이벤트 기반 시스템 구현에 적합
- 실시간 알림 시스템 등 변화에 즉각적으로 반응해야 하는 시스템에 적합함
- 주체와 옵저버 사이의 느슨한 결합을 가능하게 함
- 주체는 옵저버에 대해서 알 필요가 없다
옵저버 패턴의 단점
- 디버깅 어려움
- 주체와 옵저버가 느슨하게 연결되어 있기 때문에 옵저버의 행위 추적에 어려움을 느낌
- 성능 이슈
- 옵저버가 점점 많아질수록 많은 옵저버에게 변화에 대한 메시지를 전달해야 함
- 비동기 처리를 고려하지 않을 경우에 한 옵저버에 지연이 걸릴 경우 전체 흐름에 문제가 생김
'JAVA' 카테고리의 다른 글
[JAVA] 이터레이터 패턴(Iterator Pattern)이 없어도 될 것 같은데.. 왜 사용할까? (1) | 2025.06.10 |
---|---|
[JAVA] 프록시 패턴(Proxy Pattern)과 데코레이터 패턴(Decorator Pattern) (0) | 2025.06.10 |
[JAVA] 전략 패턴(Strategy Pattern)이란? (1) | 2025.05.23 |
[JAVA] 팩토리 패턴(Factory Pattern)이란? (0) | 2025.05.22 |
[JAVA] 싱글톤 패턴(Singleton Pattern)이란? (0) | 2025.05.20 |