본문 바로가기

STUDY/# java design pattern

Java Design Pattern - Observer Pattern

반응형

[Design Pattern]

옵저버 패턴 (JAVA Observer Pattern) 

by commin

 

Observer Pattern이란?

Observer Pattern은 객체의 상태 변화를 관찰하고 이에 따른 동작을 수행하는 디자인 패턴입니다. 이 패턴은 이벤트 기반 아키텍처에서 자주 사용됩니다. 객체가 변경되면, 해당 객체에 등록된 관찰자(observer)들이 알림을 받고, 자동으로 갱신됩니다.

Observer Pattern 예시 코드

이번 예시에서는 미디어 스트리밍 서비스에서 새로운 노래가 추가될 때, 구독자(subscriber)들에게 알리는 Observer Pattern을 구현해보겠습니다. 이를 위해, Subject와 Observer 인터페이스를 정의하고, 구독자들은 이 인터페이스를 구현합니다.

Subject 인터페이스

public interface Subject {
    public void registerObserver(Observer observer);
    public void removeObserver(Observer observer);
    public void notifyObservers();
}

Observer 인터페이스

public interface Observer {
    public void update(String songTitle);
}

구독자 클래스

public class Subscriber implements Observer {
    private String name;
    
    public Subscriber(String name) {
        this.name = name;
    }
    
    @Override
    public void update(String songTitle) {
        System.out.println(name + "님이 새로운 노래 " + songTitle + "을(를) 추가했습니다.");
    }
}

노래 추가를 담당하는 클래스

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

public class MusicService implements Subject {
    private List<Observer> observers;
    private String songTitle;
    
    public MusicService() {
        this.observers = new ArrayList<>();
    }
    
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

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

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(songTitle);
        }
    }
    
    public void addSong(String songTitle) {
        this.songTitle = songTitle;
        System.out.println("새로운 노래 " + songTitle + "을(를) 추가했습니다.");
        notifyObservers();
    }
}

테스트 클래스

public class Test {
    public static void main(String[] args) {
        MusicService musicService = new MusicService();
        
        Subscriber subscriber1 = new Subscriber("John");
        Subscriber subscriber2 = new Subscriber("Sarah");
        Subscriber subscriber3 = new Subscriber("David");
        
        musicService.registerObserver(subscriber1);
        musicService.registerObserver(subscriber2);
        musicService.registerObserver(subscriber3);
        
        musicService.addSong("Love Yourself");
    }
}

이 예시에서, MusicService 클래스는 Subject 인터페이스를 구현하고, addSong() 메서드를 호출하여 새로운 노래를 추가합니다.

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

새로운 노래가 추가되면 notifyObservers() 메서드는 등록된 모든 Observer 객체들의 update() 메서드를 호출합니다. 이 메서드는 새로운 노래의 제목을 전달하여, 구독자(subscriber)들이 새로운 노래를 알림받게 합니다. 이제 실행 결과를 확인해보겠습니다.

code새로운 노래 Love Yourself을(를) 추가했습니다.
John님이 새로운 노래 Love Yourself을(를) 추가했습니다.
Sarah님이 새로운 노래 Love Yourself을(를) 추가했습니다.
David님이 새로운 노래 Love Yourself을(를) 추가했습니다.

결과에서 볼 수 있듯이, 새로운 노래가 추가될 때, 모든 구독자들이 알림을 받았습니다. 이렇게 Observer Pattern을 사용하면, 미디어 스트리밍 서비스에서 노래 추가와 같은 이벤트를 처리할 수 있습니다.

반응형