Dev/Concept
옵저버 패턴(Observer Pattern)
마라탕천재
2024. 10. 1. 00:52
1. 옵저버 패턴이란?
옵저버 패턴(Observer Pattern)은 객체 간의 일대다 관계를 정의하여 한 객체의 상태 변화가 있을 때, 그 변화를 감지하고 다른 객체들(옵저버)에게 통지하는 디자인 패턴이다. 주로 이벤트 기반 시스템에서 많이 사용되며, 특정 객체의 상태가 변경될 때 그와 관련된 객체들에 자동으로 알림을 보내는 방식이다.
2. 옵저버 패턴의 주요 구성 요소:
- Subject (주제): 상태를 가지고 있으며, 옵저버들이 관심을 갖는 대상이다. 상태 변경이 발생하면 옵저버들에게 알린다.
- Observer (옵저버): 주제의 상태 변화를 감지하고, 주제가 상태를 변경할 때 알림을 받는 객체이다.
- ConcreteSubject (구체적인 주제): 주제의 상태를 보유하며, 옵저버들에게 상태 변화를 알리는 실제 객체이다.
- ConcreteObserver (구체적인 옵저버): 주제의 상태 변화에 반응하는 객체이다.
3. 예시 코드
// 1. Observer 인터페이스: 옵저버가 받아야 할 메서드 정의
interface Observer {
void update(String news); // 주제에서 변경된 내용을 받는 메서드
}
// 2. Subject 인터페이스: 옵저버 관리 및 알림 메서드 정의
interface Subject {
void registerObserver(Observer observer); // 옵저버 등록
void removeObserver(Observer observer); // 옵저버 제거
void notifyObservers(); // 상태 변경 시 모든 옵저버에게 알림
}
// 3. ConcreteSubject: 실제로 상태를 관리하고, 변경 시 알림을 보내는 주체
class NewsAgency implements Subject {
private List<Observer> observers = new ArrayList<>(); // 등록된 옵저버 목록
private String news; // 상태 (뉴스)
// 옵저버 등록
public void registerObserver(Observer observer) {
observers.add(observer);
}
// 옵저버 제거
public void removeObserver(Observer observer) {
observers.remove(observer);
}
// 옵저버들에게 상태 변경 알림
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(news); // 모든 옵저버에게 새로운 뉴스 전달
}
}
// 새로운 뉴스가 들어왔을 때
public void setNews(String news) {
this.news = news;
notifyObservers(); // 상태 변경을 옵저버들에게 알림
}
}
// 4. ConcreteObserver: 실제로 상태 변화를 반영하는 옵저버
class NewsSubscriber implements Observer {
private String name;
public NewsSubscriber(String name) {
this.name = name;
}
// 주제에서 상태가 변경되었을 때 호출되는 메서드
@Override
public void update(String news) {
System.out.println(name + " 님이 받은 뉴스: " + news);
}
}
// 5. 사용 예시
public class ObserverPatternExample {
public static void main(String[] args) {
// 주제 객체 생성
NewsAgency newsAgency = new NewsAgency();
// 옵저버들(구독자) 생성
Observer subscriber1 = new NewsSubscriber("구독자 1");
Observer subscriber2 = new NewsSubscriber("구독자 2");
// 옵저버 등록
newsAgency.registerObserver(subscriber1);
newsAgency.registerObserver(subscriber2);
// 뉴스 발행 (상태 변경)
newsAgency.setNews("속보: 새로운 옵저버 패턴 튜토리얼이 발행되었습니다!");
// 하나의 구독자가 구독 취소
newsAgency.removeObserver(subscriber1);
// 새로운 뉴스 발행
newsAgency.setNews("최신 뉴스: 옵저버 패턴이 간단한 예제로 설명되었습니다.");
}
}
옵저버 패턴은 상태 변경이 발생했을 때, 여러 객체에 그 변경 사항을 자동으로 통지하고 각 객체가 적절히 반응하도록 만드는 패턴이다. 이벤트나 알림 기반의 시스템에서 효과적으로 사용될 수 있다.