Observer パターン
観察対象の状態が変化すると、観察者に対して通知される。Mediator パターンと良く似ているが、パターンの目的や視点は異なる。MediatorパターンではColleague役の間を取り持って、いろいろ処理を融通してやるために状態変化の通知が行われる一方、ObserverパターンではSubjectの状態変化をObserver役に通知すること、通知して同期をとることに主眼がある。同期するのか、受け取っていろいろ処理を回すのかの違いか?
以下コード、Person(Subject)がMessageObserver,AgeObserver(Observer)に年取る(GetOlder)度に更新通知を送ってる。ぐぅぅ、dynamic_cast使っちまった。
#include <iostream> #include<string> #include <list> using namespace std; class Subject; //Observer class Observer { public : virtual void Notify(Subject *subject) = 0; }; //Subject class Subject { public : Subject(){}; virtual ~Subject(){ for(list<Observer*>::iterator it = observers_.begin(); it != observers_.end(); it++){ delete *it; } } void NotifyObservers(){ for(list<Observer*>::iterator it = observers_.begin(); it != observers_.end(); it++){ (*it)->Notify(this); } } void AddObserver(Observer *observer){ observers_.push_back(observer); } void DeleteObserver(Observer *observer){ observers_.remove(observer); } private : list<Observer*> observers_; }; //Concrete Subject class Person : public Subject { public : Person(string message,int age) : message_(message), age_(age){} ~Person(){} string GetMessage(){ return message_; } int GetAge(){ return age_; } void GetOlder(){ age_++; this->NotifyObservers(); } private : int age_; string message_; }; //Concrete Observer class MessageObserver : public Observer { public : void Notify(Subject *subject){ cout << "Received Message : " << dynamic_cast<Person*>(subject)->GetMessage() << endl; } }; class AgeObserver : public Observer { public : void Notify(Subject *subject){ cout << "Age : " << dynamic_cast<Person*>(subject)->GetAge() << endl; } }; int main() { Person *taro = new Person("My name is Taro",10); taro->AddObserver(new AgeObserver()); taro->AddObserver(new MessageObserver()); taro->GetOlder(); taro->GetOlder(); taro->GetOlder(); delete taro; return 0; }