说明
观察者模式包含两个部分:观察者,提供调用函数;被观察者,注册观察者,并在一定的条件下执行观察者的函数。
下面是一个例子:
下面是具体的代码:
1. 观察者:
/******************** Observer **********************/
class Observer {
public:
virtual void update();
};
void Observer::update() {
cout << "Observer update" << endl;
}
class ConcreteObserver : public Observer {
public:
void update() override;
};
void ConcreteObserver::update() {
cout << "ConcreteObserver update" << endl;
}
2. 被观察者
/******************** Subject **********************/
class Subject {
public:
vector<Observer *> *observers;
public:
Subject();
void registerObserver(Observer *ob);
void unregisterObserver(Observer *ob);
virtual void notifyObserver();
};
Subject::Subject() {
observers = new vector<Observer *>();
}
void Subject::registerObserver(Observer *ob) {
observers->push_back(ob);
}
void Subject::unregisterObserver(Observer *ob) {
for (auto it = observers->begin(); it != observers->end(); it++) {
if (ob == *it) {
it = observers->erase(it);
if (it == observers->end()) {
break;
}
}
}
}
void Subject::notifyObserver() {
cout << "Subject notify" << endl;
}
class ConcreteSubject : public Subject {
public:
void notifyObserver() override;
};
void ConcreteSubject::notifyObserver() {
for (auto it = observers->begin(); it != observers->end(); it++) {
(*it)->update();
}
}
3. 测试函数:
int main(void) {
Subject *s = new ConcreteSubject();
Observer *o1 = new ConcreteObserver();
Observer *o2 = new ConcreteObserver();
s->registerObserver(o1);
s->registerObserver(o2);
s->notifyObserver();
cout << "_________________分割线_________________" << endl;
s->unregisterObserver(o2);
s->notifyObserver();
return 0;
}
4. 执行结果: