옵저버 패턴(Observer Pattern)

구교석·2024년 4월 20일
post-thumbnail

옵저버 패턴(Observer Pattern)은 행동 패턴 중 하나로
행동 패턴은 주로 객체 간의 상호작용에 초점을 맞춥니다. 이러한 상호작용은 객체들이 서로 메시지를 전송하고 그에 따라 동작을 변경하거나 실행하는 방식을 나타냅니다. 행동 패턴은 이러한 객체 간의 상호작용을 효율적으로 설계하기 위한 다양한 전략과 구조를 제공합니다.

옵저버 패턴이란?

옵저버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다.
한마디로 어떤 객체의 상태가 변할 때 그와 연관된 객체 들에게 알림을 보내는 디자인 패턴이 옵저버 패턴이라고 할 수 있다.

옵저버 패턴 구조

관찰 대상이 되는 객체(⇒ Subject, 이벤트를 발생시키는 주체)에 하나 이상의 옵저버 객체를 등록시키면, 각각의 옵저버들은 관찰 대상인 객체가 발생시키는 이벤트를 받아서 처리한다.

이벤트가 발생하면 각 옵저버는 콜백(callback)을 받는다. notify 함수는 관찰 대상이 발행한 메시지 이외에, 옵저버 자신이 생성한 인자값을 전달할 수도 있다.

각각의 파생 옵저버는 이벤트가 발생했을 때 처리해야 할 각자의 동작을 notify 함수 안에 정의하면 된다.

옵저버 패턴 코드

// 관찰 대상자 / 발행자
interface ISubject {
    void registerObserver(IObserver o);
    void removeObserver(IObserver o);
    void notifyObserver();
}

class ConcreteSubject implements ISubject {
    // 관찰자들을 등록하여 담는 리스트
    List<IObserver> observers = new ArrayList<>();

    // 관찰자를 리스트에 등록
    @Override
    public void registerObserver(IObserver o) {
        observers.add(o);
        System.out.println(o + " 구독 완료");
    }

    // 관찰자를 리스트에 제거
    @Override
    public void removeObserver(IObserver o) {
        observers.remove(o);
        System.out.println(o + " 구독 취소");
    }

    // 관찰자에게 이벤트 송신
    @Override
    public void notifyObserver() {
        for(IObserver o : observers) { // 관찰자 리스트를 순회하며
            o.update(); // 위임
        }
    }
}
// 관찰자 / 구독자
interface IObserver {
    void update();
}

class ObserverA implements IObserver {
    public void update() {
        System.out.println("ObserverA 한테 이벤트 알림이 왔습니다.");
    }

    public String toString() { return "ObserverA"; }
}

class ObserverB implements IObserver {
    public void update() {
        System.out.println("ObserverB 한테 이벤트 알림이 왔습니다.");
    }

    public String toString() { return "ObserverB"; }
}
public class Client {
    public static void main(String[] args) {

        // 발행자 등록
        ISubject publisher = new ConcreteSubject();

        // 발행자를 구독할 관찰자들 리스트로 등록
        IObserver o1 = new ObserverA();
        IObserver o2 = new ObserverB();
        publisher.registerObserver(o1);
        publisher.registerObserver(o2);

        // 관찰자에게 이벤트 전파
        publisher.notifyObserver();

        // ObserverB가 구독 취소
        publisher.removeObserver(o2);

        // ObserverA 한테만 이벤트 전파
        publisher.notifyObserver();
    }
}

참고 사이트


[Design Pattern] 옵저버 패턴(Observer Pattern)
[디자인패턴] 옵저버 패턴 (Observer Pattern) 아주 간단하게 정리해보기
💠 옵저버(Observer) 패턴 - 완벽 마스터하기

profile
끊임없이 노력하는 개발자

0개의 댓글