공부/면접을 위한 CS 전공지식 노트
[CS 스터디/디자인패턴] 5. 옵저버 패턴(Observer Pattern)
규투리
2022. 12. 14. 12:57
반응형
5.1 옵저버 패턴이란?
옵저버 패턴이란?
주체가 어떤 객체의 상태 변화를 관찰하다가 변화가 생길 때 옵저버들에게 변화를 알려주는 패턴
옵저버(Observer), 말 그대로 관찰자이다.
옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하는 패턴이다. 어떤 객체의 변경 사항이 발생하였을 때 이와 연관된 객체들에게 통지하는 것이다.
여기서 주체란 객체의 상태 변화를 보고 있는 관찰자이며, 옵저버들이란 이 객체의 상태 변화에 따라 전달되는 메서드 등을 기반으로 '추가 변화 사항'이 생기는 객체들을 의미한다.
5.2 옵저버 패턴 활용 예시
1. 트위터
옵저버 패턴을 활용헌 서비스로는 트위터가 있다.
예를 들어, 내가 어떤 사람인 주체를 '팔로우'했다면 주체가 포스팅을 올리게 되면 알림이 '팔로워'에게 가게 된다.
2. MVC 패턴
주체라고 볼 수 있는 모델(model)에서 변경 사항이 생겨 update() 메서드로 옵저버인 뷰에 알려주고, 이를 기반으로 컨트롤러가 작동하는 것이다.
5.3 옵저버 패턴의 장단점
장점
1. 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있다.
2. 느슨한 결합으로 시스템이 유연하고 객체간의 의존성을 제거할 수 있다.
단점
1. 너무 많이 사용하게 되면, 상태 관리가 힘들 수 있다.
2. 데이터 배분에 문제가 생기면 자칫 큰 문제로 이어질 수 있다.
5.4 자바에서의 옵저버 패턴
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("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!!
*/
반응형