728x90
옵저버 패턴
옵저버 패턴이란 주체가 어떤 객체(subject)의 상태 변화를 관찰하다가
상태 변화가 있을 때마다 메서드 등을 통해
옵저버 목록에 있는 옵저버들에게 알려주는 디자인 패턴이다.
대표적으로 트위터의 메인 로직과 MVC패턴에 적용되었다.
아래는 옵저버 패턴을 사용한 자바 예시 코드이다.
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 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("walwal is dev champion!!");
}
}
/*
Message sended to Topic: walwal is dev champion!!
a:: got message >> walwal is dev champion!!
b:: got message >> walwal is dev champion!!
c:: got message >> walwal is dev champion!!
*/
옵저버 패턴 VS Subscriber
옵저버 패턴을 보며 subscriber와 매우 유사하다는 생각이 들었는데,
거의 같은 개념이지만 subscriber가 훨씬 더 느슨한 연결이라는 등의 차이점이 있다.
아래 블로그를 참고하면 둘의 차이점을 잘 알 수 있을 것 같다.
https://jistol.github.io/software%20engineering/2018/04/11/observer-pubsub-pattern/
Observer 패턴과 Publisher/Subscriber(Pub-Sub) 패턴의 차이점
jistol.github.io
참고: inflearn 강의 'CS 지식의 정석 - 큰돌'
728x90
'컴퓨터 공학 & 통신' 카테고리의 다른 글
[개념 정리] 네트워크 - 주요 용어 정리 (0) | 2023.07.06 |
---|---|
[개념 정리/디자인 패턴] 구조 패턴 - 프록시 패턴 (0) | 2023.07.05 |
[개념 정리/디자인 패턴] 행동 패턴 - 전략 패턴 (0) | 2023.07.05 |
[개념 정리] 의존성 주입(DI), 의존 관계 역전 원칙(DIP) (0) | 2023.07.04 |
[개념 정리/디자인 패턴] 행동 패턴 - 이터레이터 패턴 (0) | 2023.07.04 |