C++如何实现观察者设计模式?C++代码解耦实战【设计模式】
观察者模式在C++中通过抽象基类解耦Subject与Observer,用std::vector+weak_ptr管理观察者并自动清理,模板化SubjectBase提升复用性,具体类仅需继承并调用notify(),新增观察者零侵入。
观察者模式在C++中核心是解耦“被观察者”(Subject)和“观察者”(Observer),让两者只依赖抽象,不依赖具体实现。关键在于用抽象类定义接口、用容器管理观察者、用虚函数触发通知——不用信号槽、不依赖第三方库,纯标准C++就能落地。
定义抽象观察者和被观察者接口
先写两个纯虚基类:Observer 声明 update() 接口,Subject 声明 attach()/detach()/notify() 接口。所有具体类都继承它们,这样新增观察者或被观察者时,原有代码完全不用改。
注意:Observer 的 update() 通常接收 const Subject& 或 shared_ptr
实现可复用的 Subject 基类模板
把通用逻辑抽成模板,减少重复代码。例如:
// 模板化 Subject 基类,自动管理 weak_ptr 观察者
template
class SubjectBase {
protected:
std::vector<:weak_ptr>> observers_;
public:
void attach(std::shared_ptr
observers_.push_back(obs);
}
void notify() const {
for (auto it = observers_.begin(); it != observers_.end();) {
if (auto obs = it->lock()) {
obs->update(*this);
++it;
} else {
it = observers_.erase(it); // 自动清理已销毁的观察者
}
}
}
};
具体业务类按需继承并触发通知
比如一个温度传感器类:
class TemperatureSensor : public SubjectBase
private:
double temperature_ = 0.0;
public:
void setTemperature(double t) {
temperature_ = t;
notify(); // 数据一变就广播,不关心谁在监听
}
double getTemperature() const { return temperature_; }
};
再写具体观察者,比如控制台打印器和日志记录器,都只实现自己的 update(),互不影响:
- ConsoleDisplay::update() —— printf 当前温度
- Logger::update() —— 写入文件或发网络请求
使用时只需组合,不修改已有类
main() 里创建对象、建立关系即可:
int main() {
auto sensor = std::make_shared
auto display = std::make_shared
auto logger = std::make_shared
sensor->attach(display);
sensor->attach(logger);
sensor->setTemperature(25.6); // 自动触发 display 和 logger
sensor->setTemperature(26.1); // 同样自动通知
}
以后加新功能(比如发邮件告警),只要写个 EmailAlert 类继承 Observer,实现 update(),再 attach 进去——零侵入、无编译依赖、职责清晰。
基本上就这些。不复杂但容易忽略 weak_ptr 清理、const 正确性、以及模板接口的泛化粒度。写熟了,一个项目里几十个松耦合的通知场景,都能靠这几行基类搞定。
技术教程SEO上一篇 : 美柚怎么记录体温 美柚APP基础体温录入方法
下一篇 : 农历公历生日转换器官网_阴历农历查询官方入口
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!