티스토리 뷰

 

옵저버 패턴(observer pattern)

주체(Subject, 관찰자)가 옵저버 또는 리스너(listener)라 불리는 하나 이상의 객체를 관찰 대상이 되는 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다.

 

발행/구독 모델로 알려져있기도 하다.

 

이 옵저버 패턴을 활용한 서비스로는 대표적으로 트위터가 있다.

  

이미지 출처 -면접을 위한 CS 전공 지식 노트

 

 

이미지 출처 -면접을 위한 CS 전공 지식 노트

 

면접을 위한 CS 전공 지식 노트 예제에서는 topic(주체 ≒ 객체)을 기반으로 옵저버 패턴을 구현한 예제가 나와있다.

 

/*
면접을 위한 cs 전공 지식 노트 예제
4. Observer pattern 
    하나 이상의 객체를 관찰 대상이 되는 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해
    옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴
*/
import java.util.ArrayList;
import java.util.List;

interface Subject {
    public void register(Observer obj);
    public void unregister(Observer obj);
    public void notifyObservers();
    public Object getUpdate(Observer obj);
}

interface Observer {
    public void update(); 
}

// 구현 부모 클래스의 메서드를 재정의하여 구현해야함
class Topic implements Subject {
    private List<Observer> observers;
    private String message;

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

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

    @Override
    public void unregister(Observer obj) {
        observers.remove(obj); 
    }

    @Override
    public void notifyObservers() {
        this.observers.forEach(Observer::update); 
    }

    @Override
    public Object getUpdate(Observer obj) {
        return this.message;
    } 
    
    public void postMessage(String msg) {
        System.out.println("Message sended to Topic: " + msg);
        this.message = msg; 
        notifyObservers();
    }
}

class TopicSubscriber implements Observer {
    private String name;
    private Subject topic;

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

    @Override
    public void update() {
        String msg = (String) topic.getUpdate(this); 
        System.out.println(name + ":: got message >> " + msg); 
    } 
}

public class ObserverPattern { 
    public static void main(String[] args) {
        Topic topic = new Topic(); 
        Observer a = new TopicSubscriber("a", topic);
        Observer b = new TopicSubscriber("b", topic);
        Observer c = new TopicSubscriber("c", topic);
        topic.register(a);
        topic.register(b);
        topic.register(c);

        topic.postMessage("amumu is op champion!!"); 
    }
}
/* 실행 결과값

Message sended to Topic: amumu is op champion!!
a:: got message >> amumu is op champion!!
b:: got message >> amumu is op champion!!
c:: got message >> amumu is op champion!!

*/
댓글