> 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-pattern-vs-pub-sub-pattern.md).

# Observer Pattern vs Pub-Sub Pattern

**Publisher–Subscriber (Pub-Sub) pattern** আর **Observer pattern** দেখতে অনেকটা একই রকম মনে হয়, কিন্তু আসলে এদের মধ্যে কিছু গুরুত্বপূর্ণ পার্থক্য আছে।

### Observer Pattern

Observer pattern-এ **একটা অবজেক্ট (Subject)** থাকে, যেটি state পরিবর্তন হলে **সরাসরি তার observers (subscribers)** কে নোটিফাই করে।

* **Tight coupling** → Subject জানে কারা তার observer (সরাসরি reference ধরে রাখে)।
* Communication হলো **one-to-many**।
* সাধারণত একই অ্যাপ্লিকেশন/প্রসেসের মধ্যে ব্যবহৃত হয়।

**উদাহরণ:**

* UI frameworks (button click করলে সব registered listener কে নোটিফাই করে)।
* Java’s `Observer` & `Observable` (classic example)।

***

### Pub-Sub Pattern

Publisher-Subscriber pattern-এ **publisher আর subscriber একে অপরকে চেনে না**। তারা **একটা middle layer (message broker / event bus)** এর মাধ্যমে যোগাযোগ করে।

* **Loose coupling** → Publisher জানে না কে message consume করবে।
* Communication হয় **many-to-many**।
* সাধারণত distributed systems বা আলাদা সার্ভিসে ব্যবহৃত হয়।

**উদাহরণ:**

* Kafka, RabbitMQ, Redis Pub/Sub
* Microservices communication (Event-driven architecture)

***

### Observer Pattern Example

#### Step 1: Observer Interface

{% code lineNumbers="true" %}

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

{% endcode %}

#### Step 2: Concrete Observer

{% code lineNumbers="true" %}

```php
<?php
class User implements Observer {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function update($message) {
        echo $this->name . " পেলো: " . $message . PHP_EOL;
    }
}
```

{% endcode %}

#### Step 3: Subject

{% code lineNumbers="true" %}

```php
<?php
class NotificationService {
    private $observers = [];

    public function addObserver(Observer $observer) {
        $this->observers[] = $observer;
    }

    public function notifyAll($message) {
        foreach ($this->observers as $observer) {
            $observer->update($message);
        }
    }
}
```

{% endcode %}

#### Step 4: Client

{% code lineNumbers="true" %}

```php
<?php
$service = new NotificationService();
$user1 = new User("Mominur");
$user2 = new User("Rahim");

$service->addObserver($user1);
$service->addObserver($user2);

$service->notifyAll("আজকের নিউজ আপডেট এসেছে!");
```

{% endcode %}

**Output:**

```
Mominur পেলো: আজকের নিউজ আপডেট এসেছে!
Rahim পেলো: আজকের নিউজ আপডেট এসেছে!
```

***

### Pub-Sub Pattern example

Pub-Sub সাধারণত **message broker** ব্যবহার করে, কিন্তু আমরা সহজ উদাহরণে **event bus class** বানাবো।

#### Step 1: EventBus (Broker)

{% code lineNumbers="true" %}

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

    public function subscribe($eventName, callable $callback) {
        $this->subscribers[$eventName][] = $callback;
    }

    public function publish($eventName, $data) {
        if (!empty($this->subscribers[$eventName])) {
            foreach ($this->subscribers[$eventName] as $callback) {
                $callback($data);
            }
        }
    }
}
```

{% endcode %}

#### Step 2: Client

{% code lineNumbers="true" %}

```php
<?php
$bus = new EventBus();

// Subscriber 1
$bus->subscribe("news", function($msg) {
    echo "Subscriber 1 পেলো: $msg" . PHP_EOL;
});

// Subscriber 2
$bus->subscribe("news", function($msg) {
    echo "Subscriber 2 পেলো: $msg" . PHP_EOL;
});

// Publisher
$bus->publish("news", "আজকের বিশেষ সংবাদ এসেছে!");
```

{% endcode %}

**Output:**

```
Subscriber 1 পেলো: আজকের বিশেষ সংবাদ এসেছে!
Subscriber 2 পেলো: আজকের বিশেষ সংবাদ এসেছে!
```

***

#### Key Differences in this PHP example

* **Observer**: `NotificationService` সরাসরি `User` কে নোটিফাই করছে।
* **Pub-Sub**: `Publisher` এবং `Subscriber` একে অপরকে চেনে না, শুধু `EventBus` এর মাধ্যমে যোগাযোগ করছে।
* Observer = Direct communication (tight coupling, mostly in-app)
* Pub-Sub = Indirect communication via broker (loose coupling, distributed systems)
