# ऑब्ज़र्वर पैटर्न — एडवांस्ड जावा

Source: https://www.geekswithgeeks.com/hi/advanced-java/adv-observer-pattern

> publisher को यह जाने बिना कि सब्सक्राइबर कौन हैं, listener इंटरफ़ेस से इवेंट पर प्रतिक्रिया करने दें — यही पैटर्न GUI इवेंट, Spring के ApplicationEvent, और pub/sub सिस्टम के पीछे है।

## पब्लिशर व सब्सक्राइबर

एक **subject** **observer** की सूची रखता है और स्टेट बदलने पर सभी को सूचित करता है, बिना यह जाने कि हर observer क्या करता है। इससे इवेंट स्रोत प्रतिक्रियाओं से अलग हो जाता है — नए observer subject में बदलाव किए बिना जोड़े जा सकते हैं।

## न्यूनतम listener इंटरफ़ेस

यह Swing के `ActionListener`, Spring के `ApplicationListener<OrderPlaced>`, या किसी pub/sub ब्रोकर जैसा ही ढाँचा है — एक तय callback अनुबंध और सब्सक्राइबर की सूची।

```java
interface OrderListener { void onPlaced(Order o); }

class OrderService {
    private final List<OrderListener> listeners = new ArrayList<>();
    void subscribe(OrderListener l) { listeners.add(l); }

    void place(Order o) {
        // ... persist order ...
        listeners.forEach(l -> l.onPlaced(o));
    }
}

service.subscribe(order -> emailService.sendReceipt(order));
```

पैटर्न जाँच

**Quiz:** ऑब्ज़र्वर पैटर्न मुख्यतः कौन-सी समस्या हल करता है?

- [ ] सुनिश्चित करना कि क्लास का केवल एक इंस्टेंस हो
- [x] किसी ऑब्जेक्ट को कंक्रीट टाइप पर निर्भर हुए बिना कई इच्छुक पक्षों को बदलाव की सूचना देने देना
- [ ] जटिल ऑब्जेक्ट को चरणबद्ध ढंग से बनाना
- [ ] रनटाइम पर कौन-सी कंक्रीट क्लास बनानी है यह चुनना

*Answer:* किसी ऑब्जेक्ट को कंक्रीट टाइप पर निर्भर हुए बिना कई इच्छुक पक्षों को बदलाव की सूचना देने देना. 0 सिंगलटन है, 2 बिल्डर है, 3 फ़ैक्टरी है — ऑब्ज़र्वर एक-से-अनेक परिवर्तन सूचना के बारे में है।
