1.观察者模式包含以下几个核心角色:
- 主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法。
- 观察者(Observer):观察者是接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。
- 具体主题(Concrete Subject):具体主题是主题的具体实现类。它维护着观察者列表,并在状态发生改变时通知观察者。
- 具体观察者(Concrete Observer):具体观察者是观察者的具体实现类。它实现了更新方法,定义了在收到主题通知时需要执行的具体操作。
观察者模式通过将主题和观察者解耦,实现了对象之间的松耦合。当主题的状态发生改变时,所有依赖于它的观察者都会收到通知并进行相应的更新。
2.代码:
#include <iostream>
#include <vector>
class Observer{
public:
Observer(std::string _name) :name(_name) {};
virtual void update() {};
virtual std::string getName() { return name; };
private:
std::string name;
};
class NBAObserver :public Observer {
public:
NBAObserver(std::string _name) :Observer(_name) {};
virtual void update() override {
std::cout <<getName() <<"开始工作,关闭NBA直播" << std::endl;
}
};
class StockObserver :public Observer {
public:
StockObserver(std::string _name) :Observer(_name) {};
virtual void update() override {
std::cout << getName() << "开始工作,关闭股票" << std::endl;
}
};
class Subject {
public:
std::string getAction();
void setAction(std::string action);
void attach(Observer* observer);
void notifyAllObservers();
private:
std::vector<Observer*> observers;
std::string state;
};
std::string Subject::getAction() {
return state;
}
void Subject::setAction(std::string action)
{
this->state = state;
}
void Subject::attach(Observer* observer) {
observers.emplace_back(observer);
}
void Subject::notifyAllObservers()
{
for (auto observer : observers)
{
observer->update();
}
}
class SecretarySubject :public Subject {
};
int main()
{
Observer* observer1 = new NBAObserver("tom");
Observer* observer2 = new StockObserver("adam");
SecretarySubject secretary;
secretary.attach(observer1);
secretary.attach(observer2);
secretary.setAction("小心!Boss回来了!");
secretary.notifyAllObservers();
delete observer1;
delete observer2;
}
3.类图
参考资料: