开发一个应用“观察者模式”的程序实例
时间: 2023-09-09 11:06:26 浏览: 50
好的,下面是一个使用观察者模式的简单程序实例:
```
#include <iostream>
#include <vector>
using namespace std;
// 抽象主题(Subject)类
class Subject {
public:
virtual void addObserver(class Observer*) = 0;
virtual void removeObserver(class Observer*) = 0;
virtual void notifyObservers() = 0;
};
// 具体主题(Concrete Subject)类
class ConcreteSubject : public Subject {
public:
void addObserver(Observer* observer) override {
observers.push_back(observer);
}
void removeObserver(Observer* observer) override {
for (auto iter = observers.begin(); iter != observers.end(); ++iter) {
if (*iter == observer) {
observers.erase(iter);
break;
}
}
}
void notifyObservers() override {
for (auto observer : observers) {
observer->update();
}
}
void setState(int state) {
this->state = state;
notifyObservers();
}
int getState() {
return state;
}
private:
int state = 0;
vector<Observer*> observers;
};
// 抽象观察者(Observer)类
class Observer {
public:
virtual void update() = 0;
};
// 具体观察者(Concrete Observer)类
class ConcreteObserver : public Observer {
public:
ConcreteObserver(ConcreteSubject* subject) : subject(subject) {}
void update() override {
cout << "Observer " << this << " received update, new state: " << subject->getState() << endl;
}
private:
ConcreteSubject* subject;
};
int main() {
ConcreteSubject subject;
ConcreteObserver observer1(&subject);
ConcreteObserver observer2(&subject);
subject.addObserver(&observer1);
subject.addObserver(&observer2);
subject.setState(1);
subject.removeObserver(&observer2);
subject.setState(2);
return 0;
}
```
在这个程序中,`Subject` 是抽象主题类,定义了添加、移除和通知观察者的接口。`ConcreteSubject` 是具体主题类,维护一个观察者列表,当主题状态改变时通知所有观察者。
`Observer` 是抽象观察者类,定义了接收更新的接口。`ConcreteObserver` 是具体观察者类,持有对主题的引用,在接收到更新时输出状态信息。
程序中创建了一个 `ConcreteSubject` 对象,以及两个 `ConcreteObserver` 对象并添加到主题的观察者列表中。然后通过改变主题的状态来测试观察者模式的运作,最后移除一个观察者并再次改变状态。运行程序,输出如下:
```
Observer 0x7fff5fbff978 received update, new state: 1
Observer 0x7fff5fbff988 received update, new state: 1
Observer 0x7fff5fbff978 received update, new state: 2
```
可以看到,当主题的状态发生改变时,所有观察者都会收到更新。移除一个观察者后,只有一个观察者收到了更新。