C++设计模式:观察者模式的优化实现
创作时间:
作者:
@小白创作中心
C++设计模式:观察者模式的优化实现
引用
CSDN
1.
https://m.blog.csdn.net/gzjimzhou/article/details/145839492
1. 引言
在 C++ 软件与设计系列课程中,观察者模式是一个重要的设计模式。本系列课程旨在深入探讨该模式的实现与优化。在之前的课程里,我们已对观察者模式有了初步认识,本次将在前两次课程的基础上,进一步深入研究,着重解决观察者生命周期问题,提升代码的安全性、灵活性、可维护性和扩展性。
2. 观察者模式基础回顾
2.1 基本概念
观察者模式包含主题(Subject)和观察者(Observer)两个核心概念。主题负责管理观察者列表,当主题发生有趣的事情时,会通知列表中的所有观察者。观察者则关注主题的状态变化,当收到通知时会做出相应的反应。
2.2 首次实现
首次实现中,我们创建了主题和观察者类。主题类可以添加、移除观察者,并在状态变化时通知所有观察者。使用
std::forward_list
存储观察者指针,通过遍历列表调用每个观察者的
notify
函数。示例代码创建了一个主题和三个观察者,展示了添加、通知和移除观察者的完整流程。
3. 优化实现
3.1 解决生命周期问题
在首次实现中,观察者模式存在一个潜在的问题:当观察者对象被删除时,主题并不知情,这可能导致悬挂指针问题。为了解决这个问题,我们可以采用智能指针来管理观察者对象。
3.2 使用智能指针
使用
std::shared_ptr
来管理观察者对象,可以确保观察者对象在所有引用都被释放后自动删除。同时,主题类需要使用
std::weak_ptr
来存储观察者,以避免循环引用问题。
3.3 完善的实现代码
下面是使用智能指针优化后的观察者模式实现代码:
#include <iostream>
#include <memory>
#include <forward_list>
// Observer interface
class Observer {
public:
virtual ~Observer() = default;
virtual void update() = 0;
};
// Subject class
class Subject {
public:
void attach(std::shared_ptr<Observer> observer) {
observers_.push_front(observer);
}
void detach(std::shared_ptr<Observer> observer) {
for (auto it = observers_.begin(); it != observers_.end(); ++it) {
if (*it == observer) {
observers_.erase_after(it);
break;
}
}
}
void notify() {
for (auto& weak_observer : observers_) {
if (auto observer = weak_observer.lock()) {
observer->update();
}
}
}
private:
std::forward_list<std::weak_ptr<Observer>> observers_;
};
// Concrete Observer
class ConcreteObserver : public Observer {
public:
void update() override {
std::cout << "Observer received update." << std::endl;
}
};
int main() {
auto subject = std::make_shared<Subject>();
auto observer1 = std::make_shared<ConcreteObserver>();
auto observer2 = std::make_shared<ConcreteObserver>();
subject->attach(observer1);
subject->attach(observer2);
subject->notify();
subject->detach(observer1);
subject->notify();
return 0;
}
4. 总结
通过使用智能指针,我们可以有效地解决观察者模式中的生命周期问题,提高代码的安全性和可靠性。同时,这种实现方式也保持了观察者模式的灵活性和扩展性,使得系统更容易维护和升级。
热门推荐
青岛地铁闸机“常开”模式再扩60站!出行效率大幅提升
肺淋巴管平滑肌瘤病的治疗方法
肺淋巴管平滑肌瘤病的治疗方法
洞悉《周易》智慧:从数理基础到现实应用
奉贤乡土谜语真的很土吗?猜过的人才知道
老板送菜背后的温暖故事,顾客与商家的双向善意
寻访华严寺遗址:感悟流传千年的佛教智慧
预验房的意义与流程解析
邢台:“共享智造”新模式赋能中小企业提质增效
《米塔 MiSide》游戏全攻略:从入门到完全成就指南,深度解析角色与剧情互动
肺门淋巴结和纵隔淋巴结区别是什么
《生辰八字查询指南》:揭秘八字命理的奥秘
减肥期间夜里喝水:增重还是助瘦?
无线蓝牙耳机常用的电池型号尺寸有哪些?市场主流会如何发展?
服务合同违约条款怎么约定赔偿
处理非正常死亡案件的法律程序与实践研究
运动为何能对抗身体冷,有哪些运动推荐?
花生的种子藏在哪里?揭秘花生的生长奥秘
亲戚借钱每月还款怎么办
胜利的回响——岁月荣光!抗美援朝战争老兵群像
如何挑选适合家庭使用的洗衣机下水管?这种挑选如何考虑排水效率?
《植物大战僵尸》无尽模式阵型攻略:从入门到精通
六级比雅思更难?雅思6.5六级什么水平
张雪峰谈应用物理学专业:用“物理思维”撬动未来
《飞驰人生2》观后感:速度与激情中的梦想与坚持
数据驱动未来:企业如何通过精细化指标体系赢得市场先机
时间“苛刻”的nt检查,孕13周头臀长度不足真不能做nt
旋转的性质和应用
在我国繁衍了上千年的汗血宝马,如今为何绝迹了?
清明节祭祖活动的道德庇护与家国情怀