> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/system-design/design-patterns/observer-design-pattern.md).

# Observer Design Pattern

ধরুন, আপনি একটা **YouTube Channel** চালান। আপনার অনেক **Subscribers** আছে। এখন যখনই আপনি নতুন একটা ভিডিও আপলোড করবেন, তখন আপনি চান যে **Subscribers** রা সাথে সাথে নোটিফিকেশন পাক।

এই ব্যাপারটা কীভাবে হয়?

YouTube চ্যানেল সাবস্ক্রাইব করার মানে হচ্ছে, **Subscribers** নিজেকে ঐ চ্যানেলের সাথে যুক্ত (Attach) করে রাখছে। যখনই চ্যানেলে নতুন ভিডিও আসে, তখন YouTube স্বয়ংক্রিয়ভাবে সবাইকে নোটিফিকেশন পাঠায়।

এই সিস্টেমটাই হচ্ছে **Observer Design Pattern**।

***

### **Observer Design Pattern কী?**

Observer Pattern হলো Behavioral Design Pattern, যেটা One-to-Many Dependency ম্যানেজ করতে সাহায্য করে। একটি **Subject (Publisher)** থাকবে, যা **Observers (Subscribers)** দের সাথে সংযুক্ত থাকে। যখনই **Subject** কোনো পরিবর্তন করবে, তখন সমস্ত **Observers** কে আপডেট পাঠাবে।

**মূল উপাদান:**

1. **Subject (Publisher)** → যেটা পরিবর্তন ঘটাবে (YouTube Channel)।
2. **Observers (Subscribers)** → যারা পরিবর্তনের উপর রেসপন্স করবে।
3. **Update Mechanism** → যখন পরিবর্তন হবে, তখন সবাইকে জানিয়ে দেওয়া হবে।

***

### **কখন ব্যবহার করব?**

আপনি যদি এমন কোনো সিস্টেম তৈরি করেন যেখানে **একটি অবজেক্ট পরিবর্তিত হলে অনেকগুলা অবজেক্টকে স্বয়ংক্রিয়ভাবে আপডেট করতে হবে**, তাহলে **Observer Pattern** ব্যবহার করা উচিত।

#### **প্রকৃত জীবনের কিছু উদাহরণ:**

✅ **YouTube Subscription System** – নতুন ভিডিও এলেই সাবস্ক্রাইবারদের নোটিফিকেশন পাঠানো।\
✅ **Stock Market Update System** – শেয়ারের দাম পরিবর্তন হলে সকল বিনিয়োগকারীদের আপডেট পাঠানো।\
✅ **Event Listener in Laravel/PHP** – ইভেন্ট ঘটলে রেজিস্টার্ড লিসেনারদের ট্রিগার করা।

***

### **PHP তে Observer Design Pattern ইমপ্লিমেন্টেশন**

চলুন, **PHP** তে **Observer Pattern** ইমপ্লিমেন্ট করি। আমরা **YouTube Channel Subscription** এর উদাহরণ নিয়ে কাজ করবো।

#### **1️⃣ Step 1: Interface তৈরি করা**

প্রথমে একটা **Observer Interface** বানাবো, যেটা সকল **Subscribers** কে ইমপ্লিমেন্ট করতে হবে।

```php
<?php
interface Observer {
    public function update($message);
}
?>
```

এখানে `update($message)` মেথডটা আমরা পরে ইমপ্লিমেন্ট করবো, যা নোটিফিকেশন পাঠাবে।

***

#### **2️⃣ Step 2: Concrete Observers (Subscribers) তৈরি করা**

এই ক্লাসগুলো **Observer Interface** ইমপ্লিমেন্ট করবে এবং নতুন ভিডিও আপলোড হলে নোটিফিকেশন পাবে।

```php
<?php
class Subscriber implements Observer {
    private $name;
    
    public function __construct($name) {
        $this->name = $name;
    }

    public function update($message) {
        echo "Hey {$this->name}, নতুন আপডেট: {$message} \n";
    }
}
?>
```

প্রতিটি **Subscriber** এর জন্য `update()` মেথড কল হলে তারা নতুন ভিডিওর নোটিফিকেশন পাবে।

***

#### **3️⃣ Step 3: Subject (YouTube Channel) তৈরি করা**

এখন আমরা **YouTube Channel (Publisher)** তৈরি করবো।

```php
<?php
class YouTubeChannel {
    private $subscribers = [];

    // নতুন Subscriber যোগ করা
    public function subscribe(Observer $subscriber) {
        $this->subscribers[] = $subscriber;
    }

    // Subscriber আনসাবস্ক্রাইব করা
    public function unsubscribe(Observer $subscriber) {
        $this->subscribers = array_filter($this->subscribers, function($s) use ($subscriber) {
            return $s !== $subscriber;
        });
    }

    // সকল Subscribers কে নোটিফিকেশন পাঠানো
    public function notifySubscribers($message) {
        foreach ($this->subscribers as $subscriber) {
            $subscriber->update($message);
        }
    }
}
?>
```

এখানে আমরা **Subscribers** দের **subscribe()**, **unsubscribe()** এবং **notifySubscribers()** মেথড দিয়ে ম্যানেজ করছি।

***

#### **4️⃣ Step 4: Observer Pattern কে বাস্তবে চালানো**

```php
<?php
// YouTube Channel তৈরি করা
$channel = new YouTubeChannel();

// Subscribers তৈরি করা
$sub1 = new Subscriber("Rahim");
$sub2 = new Subscriber("Karim");
$sub3 = new Subscriber("Sumon");

// Subscribers কে চ্যানেলে যুক্ত করা
$channel->subscribe($sub1);
$channel->subscribe($sub2);
$channel->subscribe($sub3);

// নতুন ভিডিও আপলোড এবং নোটিফিকেশন পাঠানো
$channel->notifySubscribers("আমাদের নতুন ভিডিও: PHP Observer Pattern শেখুন!");

// একজন Subscriber আনসাবস্ক্রাইব করছে
$channel->unsubscribe($sub2);

// আবার নতুন ভিডিও আপলোড
$channel->notifySubscribers("Laravel Events এবং Listeners নিয়ে নতুন ভিডিও আসছে!");
?>
```

#### **Output হবে:**

```
Hey Rahim, নতুন আপডেট: আমাদের নতুন ভিডিও: PHP Observer Pattern শেখুন!
Hey Karim, নতুন আপডেট: আমাদের নতুন ভিডিও: PHP Observer Pattern শেখুন!
Hey Sumon, নতুন আপডেট: আমাদের নতুন ভিডিও: PHP Observer Pattern শেখুন!

Hey Rahim, নতুন আপডেট: Laravel Events এবং Listeners নিয়ে নতুন ভিডিও আসছে!
Hey Sumon, নতুন আপডেট: Laravel Events এবং Listeners নিয়ে নতুন ভিডিও আসছে!
```

দেখুন, যখন **Karim** আনসাবস্ক্রাইব করলো, তখন সে দ্বিতীয়বার কোনো নোটিফিকেশন পায়নি।

***

এইভাবেই **Observer Pattern** দিয়ে আমরা **One-to-Many Relationship** তৈরি করতে পারি, যেখানে **একটি অবজেক্ট পরিবর্তিত হলে** অন্য অবজেক্টগুলো **স্বয়ংক্রিয়ভাবে আপডেট** হয়।

💡 **Laravel** তেও এই কনসেপ্ট ব্যবহার হয় **Events & Listeners** এর মাধ্যমে।\
💡 **Vue.js, React.js** এও **Observer Pattern** ব্যবহার হয় **State Management (Redux, Vuex)** এ।

এই প্যাটার্ন বুঝতে পারলে **Real-time Notifications, Event-driven Systems** তৈরি করতে পারবেন! 🚀
