- 주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 옵저바 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴
- 주체는 객체의 상태 변화를 보고 있는 관찰자
- 옵저버는 객체의 상태 변화에 따라 전달되는 메서드를 기반으로 추가 변화 사항이 생기는 객체를 의미
package designpattern.observer;
import java.util.ArrayList;
import java.util.List;
import java.util.Observer;
// 주체
interface Subject {
public void register(Observer obj);
public void unregister(Observer obj);
public void notifyObservers();
public Object getUpdate(Observer obj);
}
// Observer
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;
}
public void update() {
String msg = (String) topic.getUpdate(this);
System.out.println(name + ":: got message >>" + msg);
}
}
public class HelloWorld {
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("ammu is op champion!!");
}
}
728x90
반응형
'Design Pattern' 카테고리의 다른 글
Iterator Pattern (0) | 2023.06.18 |
---|---|
프록시 패턴 (0) | 2023.06.18 |
전략 패턴 - Strategy Pattern (0) | 2023.06.11 |
Factory Pattern (0) | 2023.06.11 |
디자인 패턴과 Singleton Pattern (0) | 2023.06.11 |