본문 바로가기
카테고리 없음

옵저버 패턴(Observer Pattern)에 대하여

by kangs' tong 2023. 10. 28.

옵저버 패턴(Observer Pattern)

옵저버 패턴은 객체 간의 일대다 의존성 관계를 정의하는 디자인 패턴이다. 한 객체의 상태 변화를 관찰하고, 이를 다른 객체들에게 자동으로 알려주는데 사용된다. 이 패턴을 통해 객체 간의 결합도를 줄이고, 유연한 설계를 할 수 있다.

구성 요소

옵저버 패턴은 다음과 같은 구성 요소로 이루어져 있다.

  1. Subject (주체): 구독자들을 갖고 있고, 상태가 변했을 때 각 구독자에게 알림을 보내는 역할을 한다.

  2. Observer (구독자): 주체에게 등록되어 상태 변화에 따라 알림을 받는 역할을 한다.

작동 방식

  1. 주체 클래스는 등록된 모든 구독자들을 저장하기 위한 리스트를 유지한다.

  2. 주체 클래스에서 정의한 메서드를 통해 구독자들을 등록하고 제거할 수 있다.

  3. 주체 클래스의 상태가 변화할 때마다 등록된 구독자들에게 알림을 보낸다.

  4. 각 구독자들은 알림을 받는 메서드를 구현하여 주체 객체로부터의 상태 변화를 처리한다.

예제

import java.util.ArrayList;
import java.util.List;

// Subject
class WeatherStation {
    private List<Observer> observers = new ArrayList<>();
    private int temperature;

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void setTemperature(int temperature) {
        this.temperature = temperature;
        notifyObservers();
    }

    private void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temperature);
        }
    }
}

// Observer
interface Observer {
    void update(int temperature);
}

// 구독자 클래스
class MobileDevice implements Observer {
    @Override
    public void update(int temperature) {
        System.out.println("새로운 온도: " + temperature);
        // 모바일 기기에 대한 추가 로직 작성
    }
}

class DesktopMonitor implements Observer {
    @Override
    public void update(int temperature) {
        System.out.println("새로운 온도: " + temperature);
        // 데스크톱 모니터에 대한 추가 로직 작성
    }
}

public class Main {
    public static void main(String[] args) {
        WeatherStation weatherStation = new WeatherStation();
        Observer mobileDevice = new MobileDevice();
        Observer desktopMonitor = new DesktopMonitor();

        weatherStation.addObserver(mobileDevice);
        weatherStation.addObserver(desktopMonitor);

        weatherStation.setTemperature(25);
        // "새로운 온도: 25" 출력

        weatherStation.removeObserver(mobileDevice);

        weatherStation.setTemperature(30);
        // "새로운 온도: 30" 출력
    }
}

마무리

옵저버 패턴은 주체 클래스와 구독자 클래스 간의 느슨한 결합을 제공하는 디자인 패턴이다. 주체 객체의 상태 변화를 옵저버들에게 자동으로 알려줌으로써 객체 간의 상호작용을 유연하게 구현할 수 있다.

댓글