This pattern is widely used in embedded systems for sensor updates, event handling, UI refresh, and interrupt-driven systems.
- Event-driven updates
- Decouples producers from consumers
C Example
#include <stdio.h>
typedef void (*Observer)(int);
void display(int value) {
printf("Display updated: %d\n", value);
}
void logger(int value) {
printf("Log value: %d\n", value);
}
void notifyObservers(Observer obs[], int count, int value) {
for(int i = 0; i < count; i++)
obs[i](value);
}
int main() {
Observer observers[] = {display, logger};
notifyObservers(observers, 2, 42);
}
C++ Example
#include <iostream>
#include <vector>
using namespace std;
class Observer {
public:
virtual void update(int value) = 0;
};
class Display : public Observer {
public:
void update(int value) override {
cout << "Display: " << value << endl;
}
};
class Sensor {
vector<Observer*> observers;
public:
void attach(Observer* o) { observers.push_back(o); }
void setValue(int v) {
for(auto o : observers) o->update(v);
}
};
int main() {
Sensor s;
Display d;
s.attach(&d);
s.setValue(25);
}