JAVA · 객체지향
옵저버 패턴
이벤트 발행-구독 모델을 구현하는 옵저버 패턴입니다.
객체지향중급observer옵저버이벤트Consumer
핵심 설명
이벤트 발행-구독 모델을 구현하는 옵저버 패턴입니다.
Java code
import java.util.*;
import java.util.function.Consumer;
public class ObserverPattern {
// 이벤트 발행자
static class EventEmitter<T> {
private final Map<String, List<Consumer<T>>> listeners =
new HashMap<>();
void on(String event, Consumer<T> listener) {
listeners.computeIfAbsent(event, k -> new ArrayList<>())
.add(listener);
}
void off(String event, Consumer<T> listener) {
List<Consumer<T>> list = listeners.get(event);
if (list != null) list.remove(listener);
}
void emit(String event, T data) {
List<Consumer<T>> list = listeners.get(event);
if (list != null) {
list.forEach(l -> l.accept(data));
}
}
}
public static void main(String[] args) {
EventEmitter<String> emitter = new EventEmitter<>();
// 리스너 등록
Consumer<String> logger = msg -> System.out.println("[LOG] " + msg);
Consumer<String> alert = msg -> System.out.println("[ALERT] " + msg);
emitter.on("error", logger);
emitter.on("error", alert);
emitter.on("info", logger);
// 이벤트 발행
emitter.emit("error", "서버 다운!");
emitter.emit("info", "정상 동작");
}
}학습 팁
Consumer를 리스너로 사용하면 람다로 간결하게 등록할 수 있습니다. 타입 안전한 이벤트 시스템을 만들 수 있습니다.
주의할 점
리스너를 해제하지 않으면 메모리 누수가 발생합니다. WeakReference를 사용하거나 반드시 off()를 호출하세요.
자주 묻는 질문
옵저버 패턴란 무엇인가요?
이벤트 발행-구독 모델을 구현하는 옵저버 패턴입니다.
옵저버 패턴 학습 시 주의할 점은 무엇인가요?
리스너를 해제하지 않으면 메모리 누수가 발생합니다. WeakReference 를 사용하거나 반드시 off() 를 호출하세요.