पाठ 27 / 38

ऑब्ज़र्वर पैटर्न

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

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

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

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

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

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));

पैटर्न जाँच

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

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

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