옵저버 패턴
옵저버패턴이란 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 어떤 객체의 변경 사항이 발생하였을 때 이와 연관된 객체들에게 알려주는 디자인 패턴이라고 생각하면 된다.
옵저버 패턴에는 주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)가 존재하며 이들의 관계는 1:1이 될 수도 있고 1:N이 될 수 있다.
옵저버 패턴 사용 예시
공지사항을 알릴 때를 예제로 공지사항을 전파할 때(상태변화) 옵저버와 관련된 객체들(유저들)에게 통지하도록 하는 간단한 예제를 옵저버 패턴으로 만들 수 있다.
public interface Observer {
void update();
}
공지사항을 받았을 경우 알림을 출력하는 update 함수이다.
public 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);
}
}
Observer를 구현한 클래스이다.
public interface Subject {
void register(Observer obj);
void unregister(Observer obj);
void notifyObservers();
Object getUpdate(Observer obj);
}
import java.util.ArrayList;
import java.util.List;
public class Topic implements Subject {
private final 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();
}
}
옵저버에 공지사항을 받을 객체를 추가하고 삭제하며 공지사항을 전파하는 기능을 가진 Topic클래스를 만들어 주었다.
public class Main {
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(" Hello Everyone!!");
// Message sended to Topic: Hello Everyone!!
// a::got message >> Hello Everyone!!
// b::got message >> Hello Everyone!!
// c::got message >> Hello Everyone!!
}
}
옵저버 패턴의 장단점
장점
- 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있다.
- 느슨한 결합으로 시스템이 유연하고 객체 간의 의존성을 제거할 수 있다.
단점
- 너무 많이 사용하게 되면, 상태 관리가 힘들 수 있다
- 데이터 배분에 문제가 생기면 자칫 큰 문제로 이어질 수 있다.
정리
- 옵저버 패턴은 이벤트 처리, GUI 프로그래밍, MVC 아키텍처 등에서 활용된다.
- 객체 간의 상호작용을 유연하고 효율적으로 구현하는데 도움을 준다.
- 주체와 옵저버는 인터페이스를 통해 상호작용하며, 이를 통해 코드의 재사용성과 유지 보수성을 높일 수 있다.
'CS' 카테고리의 다른 글
이터레이터 패턴(Iterator Pattern) (0) | 2023.05.16 |
---|---|
프록시 패턴(Proxy Pattern) (0) | 2023.05.12 |
전략 패턴(Strategy Pattern) (0) | 2023.05.10 |
팩토리 메소드 패턴(Factory Method Pattern) (0) | 2023.04.29 |
싱글톤 패턴(Singleton Pattern) (0) | 2023.04.27 |