반응형
1. 옵저버 패턴이란?
옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다. (PUB/SUB)
쉽게 말해, 유튜버들이 새로운 영상을 올렸을 때 구독자들에게 알림을 보내주는 것이라 생각하면 된다.
사용자가 유튜버 채널에 구독 -> 유튜버가 채널에 새로운 영상 업로드 -> 해당 채널을 구독한 사람들에게 이벤트 통지
2. 샘플코드
자바에서 기본적으로 Observer 인터페이스와 Observable 클래스를 제공하지만 패턴을 직접 만들어 보는게 목적이므로 새롭게 정의하겠다.
Subscriber
public interface Subscriber
{
void handleEvent();
}
UML에서 Observer의 역할을 한다.
Computer, Notebook
public class Computer implements Subscriber {
public static final String KEY = Computer.class.getName();
@Override
public void handleEvent() {
System.out.println("Computer");
}
}
public class Notebook implements Subscriber {
public static final String KEY = Notebook.class.getName();
@Override
public void handleEvent() {
System.out.println("Notebook");
}
}
ConcreteObserverA, ConcreteObserverB 역할을 한다.
Publisher
public class Publisher
{
private Map<String, List<Subscriber>> mSubscribers = new HashMap<>();
public void register(String key, Subscriber event)
{
if (mSubscribers.containsKey(key)) {
mSubscribers.get(key).add(event);
} else {
List<Subscriber> events = new ArrayList<>();
events.add(event);
mSubscribers.put(key, events);
}
}
public void unRegister(String key, Subscriber event)
{
if (mSubscribers.containsKey(key))
{
mSubscribers.get(key).remove(event);
}
}
public void notifyEvent(String key)
{
mSubscribers.get(key).forEach(Subscriber::handleEvent);
}
}
UML에서 Subject이다.
기본적으로 주제를 등록하고, 해제하고, 통지하는 함수가 있어야 한다.
Client
public class Client
{
public static void main(String[] args) {
Subject subject = new Subject(); // 통지자 생성
// 구독 등록
Computer computer1 = new Computer();
Computer computer2 = new Computer();
Notebook notebook1 = new Notebook();
Notebook notebook2 = new Notebook();
subject.register(Computer.KEY, computer1);
subject.register(Computer.KEY, computer2);
subject.register(Notebook.KEY, notebook1);
subject.register(Notebook.KEY, notebook2);
// 구독 등록
// 구독 해제
subject.unRegister(Notebook.KEY, notebook1);
// 구독 해제
subject.notifyEvent(Computer.KEY);
subject.notifyEvent(Notebook.KEY);
}
}
결과
반응형
'Pattern > GOF' 카테고리의 다른 글
행위패턴 - 책임 연쇄 패턴 (0) | 2022.05.31 |
---|---|
구조패턴 - 프록시 (0) | 2022.05.26 |
구조패턴 - 데코레이션 패턴 (0) | 2022.05.24 |
구조패턴 - 컴포짓패턴 (0) | 2022.05.23 |
생성패턴 - 팩토리메서드 (0) | 2022.05.11 |