본문 바로가기
Java

[Java] 옵저버 패턴 활용 예시 구현하기

by teamnova 2025. 4. 19.
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;
    }
}

 

 

 

 

실행 결과

 

주체에 등록된 관찰자들의 데이터가 업데이트 되는 것을 확인할 수 있습니다.