觀察者模式定義物件間一對多依賴,主題狀態變更時自動通知所有觀察者。本文從零建構基礎架構:抽象觀察者介面、主題類別管理訂閱清單、通知機制,並以「MM 情報郵件組」為例示範完整流程。
enum MMStatus { Dining, Sleeping, Working };
struct Subscriber { // 抽象觀察者
virtual void action(MMStatus status) = 0;
virtual ~Subscriber() {}
};
class MMIntelligenceAgent { // 主題
public:
void subscribe(Subscriber& s) { subscribers_.push_back(&s); }
void desubscribe(Subscriber& s) {
subscribers_.erase(remove(subscribers_.begin(), subscribers_.end(), &s), subscribers_.end());
}
private:
void notifyAll(MMStatus status) {
for (auto it = subscribers_.begin(); it != subscribers_.end(); ++it)
(*it)->action(status);
}
std::list<Subscriber*> subscribers_;
};
struct Larcener : public Subscriber {
virtual void action(MMStatus status) {
if (status == Sleeping) { /* 偷竊行動 */ }
}
};
void MMIntelligenceAgent::trace() {
// 偵測 MM 狀態變更...
MMStatus status = ...;
notifyAll(status);
}
int main() {
Larcener l;
MMIntelligenceAgent mia;
mia.subscribe(l);
mia.trace(); // 觸發通知
mia.desubscribe(l);
}