行为型模式
观察者模式: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新,消息队列、事件分发等等都使用了这种设计模式。
本节我们以一个新闻发布和订阅系统的例子来讲述观察者模式
下面代码是抽象类的定义
class Observer {
public:
Observer(string& name) {
this->name_ = name;
}
string& getName() {
return name_;
}
virtual void dispatch(const std::string& subject, const std::string& content) = 0;
protected:
string name_;
};
class Subject {
public:
// 订阅
void subscribe(Observer* observer) {
observers[observer->getName()] = observer;
}
// 取消订阅
void unsubscribe(Observer* observer) {
auto it = observers.find(observer->getName());
if (it != observers.end()) {
observers.erase(it);
}
}
virtual void notify(const std::string&& news) = 0;
protected:
map<string, Observer*> observers;
};
下面是实体类的定义
// 体育新闻
class SportsNews : public Subject {
public:
void notify(const std::string&& news) {
for (auto it : observers) {
it.second->dispatch("sports", news);
}
}
};
// 军事新闻
class MilitaryNews : public Subject {
public:
void notify(const std::string&& news) {
for (auto it : observers) {
it.second->dispatch("military", news);
}
}
};
// 读者1
class Reader1 : public Observer {
public:
Reader1(string&& name) : Observer(name) {}
void dispatch(const std::string& subject, const std::string& content) {
cout << name_ << " recv " << subject << ": " << content << endl;
}
};
// 读者2
class Reader2 : public Observer {
public:
Reader2(string&& name) : Observer(name) {}
void dispatch(const std::string& subject, const std::string& content) {
cout << name_ << " recv " << subject << ": " << content << endl;
}
};
使用示例
int main() {
SportsNews sportsNews;
MilitaryNews militaryNews;
Reader1 reader1("reader1");
Reader1 reader2("reader2");
// 读者1和读者2都订阅了体育新闻
sportsNews.subscribe(&reader1);
sportsNews.subscribe(&reader2);
// 读者1订阅了军事新闻
militaryNews.subscribe(&reader1);
// 新闻发布
sportsNews.notify("7月体育新闻要点");
militaryNews.notify("7月军事新闻要点");
return 0;
}
运行结果
reader1 recv sports: 7月体育新闻要点
reader2 recv sports: 7月体育新闻要点
reader1 recv military: 7月军事新闻要点
下面是具体的UML类图