본문 바로가기

JAVA/디자인 패턴

[Design Pattern] Observer(옵저버) 패턴이란?

반응형
행위 패턴(Behavioral Pattern)


옵저버 패턴(Observer Pattern)은 객체 지향 디자인 패턴 중 하나로, 객체 사이의 의존성을 줄이고, 유연하게 상호작용하도록 도와주는 패턴입니다. 이 패턴은 한 객체의 상태가 변경되었을 때, 그 객체에 의존하는 다른 객체들이 자동으로 그 변경사항을 알 수 있도록 해주는 방법을 제공합니다.

이 패턴에서는 주체(Subject) 객체와 관찰자(Observer) 객체가 있습니다. 주체 객체는 상태가 변경될 때마다 자신에게 등록된 모든 관찰자 객체들에게 변경사항을 알리는 역할을 합니다. 관찰자 객체는 주체 객체의 상태를 관찰하다가 변경사항을 감지하면, 이에 대응하는 작업을 수행합니다.

 

옵저버 패턴은 매우 널리 사용되며, 대표적으로 아래와 같은 분야에서 사용됩니다.

 

  1. GUI 프로그래밍: 자바 스윙(Swing) 라이브러리에서 이벤트 리스너(Event Listener)와 함께 사용됩니다. 버튼 클릭, 마우스 클릭 등 사용자의 동작에 따라 변화하는 화면을 구현할 때 유용합니다.

  2. 온라인 게시판: 게시글이 등록될 때, 해당 게시판을 구독하는 사용자들에게 이메일 알림 등의 방식으로 알리는 경우에 사용됩니다.

  3. 주식 시장 등 금융 분야: 주가 등의 시장 정보가 변경될 때, 해당 정보를 구독하는 개인 또는 기업에게 변경사항을 알리는 경우에 사용됩니다.

  4. 인터넷 브라우저: 자바스크립트에서 이벤트 리스너와 함께 사용됩니다. 웹 페이지에서 발생하는 클릭, 스크롤, 입력 등의 이벤트에 따라 웹 페이지를 동적으로 변화시킬 때 사용됩니다.

옵저버 패턴은 이벤트 기반 시스템에서 주로 사용되며, 이벤트가 발생하면 등록된 모든 관찰자 객체들에게 이벤트를 전달하여 각 객체가 필요한 작업을 수행할 수 있도록 도와줍니다. 이를 통해 객체 간의 의존성을 줄이고, 유연하고 확장 가능한 코드를 작성할 수 있습니다.

 

Observer 패턴 예제

아래 예제는 옵저버 패턴을 이용하여 블로그 게시물을 등록하고, 게시물 등록 이벤트를 감지하는 관찰자 객체를 구현한 예제입니다.

Diagrams


Subject (주체) 클래스

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

public class Blog {
    private List<Observer> observers = new ArrayList<Observer>();
    private String postTitle;

    public String getPostTitle() {
        return postTitle;
    }

    public void setPostTitle(String postTitle) {
        this.postTitle = postTitle;
        notifyObservers();
    }

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

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

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



Observer (관찰자) 인터페이스

public interface Observer {
    public void update();
}



ConcreteObserver (구체적인 관찰자) 클래스

public class User implements Observer {
    private String name;
    private Blog blog;

    public User(String name, Blog blog) {
        this.name = name;
        this.blog = blog;
    }

    public void update() {
        System.out.println("안녕하세요 [" + name + "]님, 새로운 블로그 게시물이 등록되었습니다 : " + blog.getPostTitle());
    }
}



예제 실행을 위한 Main 클래스

public class Main {
    public static void main(String[] args) {
        Blog blog = new Blog();

        User user1 = new User("유저1", blog);
        User user2 = new User("유저2", blog);

        blog.attach(user1);
        blog.attach(user2);

        blog.setPostTitle("Observer Pattern in Java");
    }
}



위 예제에서, Blog 클래스는 Subject 역할을 합니다. 이 클래스는 등록된 모든 관찰자 객체들에게 변경사항을 알리기 위한 attach, detach, notifyObservers 메소드를 가지고 있습니다.

User 클래스는 ConcreteObserver 역할을 합니다. 이 클래스는 블로그 게시물이 변경될 때마다 게시물의 제목을 출력하는 update 메소드를 가지고 있습니다.

Main 클래스에서는 블로그 객체를 생성하고, 두 개의 User 객체를 생성하여 블로그 객체에 등록합니다. 그 다음, 블로그 객체의 게시물 제목을 변경하면, 등록된 모든 User 객체들이 게시물 제목이 변경됐다는 메시지를 출력하게 됩니다.

반응형