观察者模式
其他二十三种设计模式
#include<iostream>
#include<list>
using namespace std;
class AbstractObserver {
public:
virtual void Update(string) = 0;
};
class AbstractSubject {
public:
virtual void Attach(AbstractObserver* _observer) = 0;
virtual void Detach(AbstractObserver* _observer) = 0;
virtual void Notify() = 0;
};
class ConcreteSubject :public AbstractSubject {
public:
string SubjectState(string _subjectState) {
this->subjectState = _subjectState;
return subjectState;
}
virtual void Attach(AbstractObserver* _observer) {
observers.push_back(_observer);
}
virtual void Detach(AbstractObserver* _observer) {
observers.remove(_observer);
}
virtual void Notify() {
for (list<AbstractObserver*>::iterator i = observers.begin(); i != observers.end(); i++) {
(*i)->Update(subjectState);
}
}
private:
list<AbstractObserver*> observers;
string subjectState;
};
class ConcreteObserver :public AbstractObserver {
public:
ConcreteObserver(ConcreteSubject* _subject, string _name) {
this->subject = _subject;
this->name = _name;
}
virtual void Update(string _subjectState) {
this->observerState = subject->SubjectState(_subjectState);
cout << "观察者:" << name << " 状态:" << observerState << endl;
}
ConcreteSubject* Subject() {
return subject;
}
private:
string name;
string observerState;
ConcreteSubject* subject;
};
void test1() {
ConcreteSubject* s = new ConcreteSubject();
s->Attach(new ConcreteObserver(s, "X"));
s->Attach(new ConcreteObserver(s, "Y"));
s->Attach(new ConcreteObserver(s, "Z"));
s->SubjectState("ABC");
s->Notify();
delete s;
}
int main() {
test1();
return 0;
}