728x90
오늘은 옵저버 패턴을 활용해 데이터를 업데이트하는 예시를 구현해보겠습니다.
옵저버 패턴은 주체(subject) 라 불리는 객체가 해당 객체 자신에게 의존하는 관찰자들(observer)의 목록을 관리하고, 주체의 상태가 변경될때마다 관찰자들에게 알려주는 디자인 패턴 입니다.
Main 클래스
public class Main {
public static void main(String[] args) {
// Subject(주체) 생성
Subject subject = new Subject();
// Observer(관찰자) 생성
Observer observer1 = new ConcreteObserver("Observer 1");
Observer observer2 = new ConcreteObserver("Observer 2");
Observer observer3 = new ConcreteObserver("Observer 3");
// Observer들을 Subject에 등록
subject.attach(observer1);
subject.attach(observer2);
subject.attach(observer3);
// Subject의 상태 변경 => 모든 Observer에게 알림이 전달됨
System.out.println("첫 번째 상태 변경:");
subject.setState("변경한 상태값(첫번째)");
// Observer2 제거
subject.detach(observer2);
// 다시 Subject의 상태 변경 => observer1과 observer3만 알림 받음
System.out.println("\n두 번째 상태 변경 (Observer 2 제거 후):");
subject.setState("변경한 상태값(두번째)");
}
}
Observer 인터페이스
public interface Observer {
//Subject(주체)의 상태 변화를 감지하고자 하는 모든 객체가 구현해야 하는 인터페이스
//즉, 옵저버 패턴의 관찰자 역할을 하고싶은 경우 구현해야할 메서드를 정의한 인터페이스
//Subject로부터 상태 변화 알림을 받는 메서드
void update(Object data);
}
Subject 클래스
public class Subject {
private Object state; //주체가 가지고 있는 상태값
private List<Observer> observers = new ArrayList<>(); //주체가 관리중인 옵저버 객체들
//주체의 상태값이 변화했음을 알려줄 옵저버 객체 추가 메서드
public void attach(Observer observer) {
this.observers.add(observer);
}
//주체의 상태값이 변화했음을 알려줄 옵저버 객체 제거 메서드
public void detach(Observer observer) {
this.observers.remove(observer);
}
//모든 옵저버 객체들에게 알림을 전달해주는 메서드
protected void notifyObservers() {
for (Observer observer : observers) {
observer.update(state);
}
}
//주체의 상태값 변경 메서드(상태값 변경시 자동으로 옵저버들에게 변경되었음 전달)
public void setState(Object state) {
this.state = state;
notifyObservers();
}
//주체의 상태값 조회 메서드
public Object getState() {
return state;
}
}
ConcreteObserver 클래스
public class ConcreteObserver implements Observer {
//실제 구현한 옵저버 클래스
private Object observerState; //이 옵저버 객체가 가지고 있는 상태값
private String name; // 예시 테스트 할때 해당 옵저버 객체가 누구인지 출력창에서 식별을 위한 이름
//생성자
public ConcreteObserver(String name) {
this.name = name;
}
//Subject로부터 상태 변화 알림을 받는 메서드
@Override
public void update(Object data) {
this.observerState = data;
System.out.println(name + " 가 해당 데이터로 업데이트함: " + data);
}
// 상태값 조회 메서드
// 해당 현재 상태값 리턴
public Object getState() {
return observerState;
}
}
실행 결과
주체에 등록된 관찰자들의 데이터가 업데이트 되는 것을 확인할 수 있습니다.
'Java' 카테고리의 다른 글
[JAVA] 사용자 정의 예외 만들기 (0) | 2025.04.24 |
---|---|
[Java] HttpClient 사용해서 OpenAI GPT API 호출하기 (0) | 2025.04.23 |
[JAVA] 예외 처리(Exception Handling) (0) | 2025.04.17 |
[Java] Apache POI로 Excel 파일을 .txt로 변환하기 (0) | 2025.04.16 |
[Java] 자바 Record 불변 데이터 객체 쉽게 만들기 (Java 14+) (0) | 2025.04.14 |