• 이벤트 발생 시 미리 등록된 다른 클래스에 통보해주는 패턴
  • 한 객체 상태 변화에 따라 다른 객체의 상태도 연동되도록 하는 일대다 객체 의존 관계 구성
    • 변경 발생 시 상대 객체의 의존 않고 변경을 통보하고자 할 때 유용

예제 Java Code

Embeded Java Observer, Observable

package src.observer;  
  
import java.util.Observable;  
import java.util.Observer;  
  
public class EmbededObserverPatternExample {  
    public static void main(String[] args) {  
        NewsFeed newsFeed = new NewsFeed();  
        Subscriber alice = new Subscriber("Alice");  
        Subscriber bob = new Subscriber("Bob");  
        newsFeed.addObserver(alice);  
        newsFeed.addObserver(bob);  
  
        newsFeed.setNews("First News~~");  
        newsFeed.setNews("Second News~~~~!");  
    }  
}  
  
//주제 Subjectclass NewsFeed extends Observable {  
    public void setNews(String news) {  
        setChanged();  
        notifyObservers(news);  
    }  
}  
  
// Observer  
class Subscriber implements Observer {  
    private String name;  
  
    public Subscriber(String name){  
        this.name = name;  
    }  
  
    @Override  
    public void update(Observable o, Object arg) {  
        System.out.println(name + " received news update: " + arg);  
    }  
}

DIY

package src.observer;  
  
import java.util.ArrayList;  
import java.util.List;  
  
public class DIYObserverPatternExample {  
    public static void main(String[] args) {  
        Topic topic = new Topic();  
        Observer a = new TopicSubscriber("A");  
        Observer b = new TopicSubscriber("B");  
  
        topic.register(a);  
        topic.register(b);  
  
        topic.postMessage("HELLO OBSERVERS!");  
    }  
}  
  
interface Subject{  
    void register(Observer observer);  
  
    void unregister(Observer observer);  
  
    void notifyObservers(String msg);  
}  
  
interface Observer{  
    void update(String msg);  
}  
  
// Concrete Subject  
class Topic implements Subject{  
    private List<Observer> observers = new ArrayList<>();  
  
    @Override  
    public void register(Observer observer) {  
        observers.add(observer);  
    }  
  
    @Override  
    public void unregister(Observer observer) {  
        observers.remove(observer);  
    }  
  
    @Override  
    public void notifyObservers(String msg) {  
        for (Observer observer : observers) {  
            observer.update(msg);  
        }  
    }  
  
    public void postMessage(String msg) {  
        System.out.println("Message posted: " + msg);  
        notifyObservers(msg);  
    }  
}  
  
// ConcreteObserver  
class TopicSubscriber implements Observer {  
    private String name;  
  
    public TopicSubscriber(String name){  
        this.name = name;  
    }  
    @Override  
    public void update(String msg) {  
        System.out.println(name+" received: "+msg);  
    }  
}