1.1.4 Observer Pattern

1.1.4 옵저버 패턴

옵저버 패턴(Observer Pattern)은 객체의 상태 변화를 관찰하는 옵저버들에게 자동으로 통지하도록 하는 디자인 패턴입니다. 주제(Subject) 객체의 상태가 변경되면, 그와 연결된 모든 옵저버(Observer)들에게 알림이 전달되어 각 옵저버가 변화에 대응할 수 있게 합니다. 이 패턴은 주로 이벤트 핸들링 시스템, 모델-뷰-컨트롤러(MVC) 아키텍처 등에서 많이 사용됩니다.

옵저버 패턴의 특징

  1. 느슨한 결합: 주제와 옵저버 간의 결합도를 낮춰, 시스템의 유연성과 확장성을 높입니다.

  2. 자동 업데이트: 주제의 상태가 변경되면 옵저버들에게 자동으로 통지되어 상태를 동기화합니다.

  3. 일대다 관계: 하나의 주제 객체가 여러 옵저버 객체들에게 변경 사항을 통지할 수 있습니다.

옵저버 패턴 구현 예제 (Java)

다음은 Java에서 옵저버 패턴을 구현한 예제입니다:

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

// 옵저버 인터페이스 정의
interface Observer {
    void update(String message);
}

// 주제(Subject) 인터페이스 정의
interface Subject {
    void registerObserver(Observer observer);
    void unregisterObserver(Observer observer);
    void notifyObservers();
}

// 구체적인 주제 클래스
class Topic implements Subject {
    private List<Observer> observers;
    private String message;

    public Topic() {
        this.observers = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer observer) {
        if (!observers.contains(observer)) {
            observers.add(observer);
        }
    }

    @Override
    public void unregisterObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }

    public void postMessage(String message) {
        System.out.println("Message sent to Topic: " + message);
        this.message = message;
        notifyObservers();
    }
}

// 구체적인 옵저버 클래스
class TopicSubscriber implements Observer {
    private String name;

    public TopicSubscriber(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + " received message: " + message);
    }
}

// 메인 클래스
public class ObserverPatternDemo {
    public static void main(String[] args) {
        Topic topic = new Topic();

        Observer observer1 = new TopicSubscriber("Observer 1");
        Observer observer2 = new TopicSubscriber("Observer 2");
        Observer observer3 = new TopicSubscriber("Observer 3");

        topic.registerObserver(observer1);
        topic.registerObserver(observer2);
        topic.registerObserver(observer3);

        topic.postMessage("Hello Observers!");

        topic.unregisterObserver(observer2);

        topic.postMessage("Hello again!");
    }
}

위 예제에서는 Subject 인터페이스와 Observer 인터페이스를 정의하고, 이를 구현한 Topic 클래스와 TopicSubscriber 클래스를 통해 옵저버 패턴을 구현합니다. Topic 클래스는 메시지를 게시하고, 등록된 옵저버들에게 변경 사항을 통지합니다. TopicSubscriber 클래스는 Observer 인터페이스를 구현하여 주제로부터 메시지를 받아 처리합니다.

옵저버 패턴의 장점과 단점

장점:

  • 느슨한 결합: 주제와 옵저버 간의 결합도를 낮춰, 시스템의 유연성과 확장성을 높입니다.

  • 재사용성: 옵저버 패턴을 사용하면 주제와 옵저버 객체를 독립적으로 재사용할 수 있습니다.

  • 동적 추가/삭제: 런타임에 옵저버를 동적으로 추가하거나 제거할 수 있습니다.

단점:

  • 성능 저하: 옵저버가 많을 경우, 주제 객체의 상태 변경 시 모든 옵저버에게 통지하는 과정에서 성능 저하가 발생할 수 있습니다.

  • 복잡성 증가: 주제와 옵저버 간의 상호 작용이 많아질수록 코드의 복잡성이 증가할 수 있습니다.

  • 예상치 못한 업데이트: 옵저버가 주제의 상태 변경에 대해 예측하지 못한 업데이트를 받을 수 있습니다.

옵저버 패턴은 이벤트 기반 시스템에서 주로 사용되며, 객체 간의 느슨한 결합을 유지하면서도 효과적으로 상태 변화를 통지할 수 있는 유용한 패턴입니다. 이를 통해 시스템의 유연성과 확장성을 높일 수 있으며, 코드의 재사용성을 극대화할 수 있습니다.

Last updated