PHpullh
학습 라이브러리/Java/옵저버 패턴

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() 를 호출하세요.

Continue Learning

Java 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.