当前位置: 首页 > wzjs >正文

discuz网站开发做战袍网站

discuz网站开发,做战袍网站,刚刚大连发布紧急通知,青岛做网站优化哪家好1. 模式定义 观察者模式(Observer Pattern)是一种行为型设计模式,定义了对象间的一对多依赖关系。当一个对象(被观察者/主题)状态改变时,所有依赖它的对象(观察者)都会自动收到通知…

1. 模式定义

观察者模式(Observer Pattern)是一种行为型设计模式,定义了对象间的一对多依赖关系。当一个对象(被观察者/主题)状态改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。该模式广泛应用于事件处理系统、GUI组件交互和实时数据监控等场景。


2. 核心思想

解耦:将主题与观察者解耦,使它们可以独立变化
动态订阅:支持观察者随时加入/退出通知列表
自动传播:状态变化时自动触发通知机制


3. 模式结构

在这里插入图片描述

关键角色:
  • Subject(主题接口)

    • 维护观察者列表
    • 提供注册/注销方法
    • 定义通知方法notify()
  • ConcreteSubject(具体主题)

    • 存储具体状态数据
    • 状态改变时触发通知
  • Observer(观察者接口)

    • 定义更新接口update()
  • ConcreteObserver(具体观察者)

    • 实现具体的更新逻辑

4. C++实现示例(气象监测系统)

完整代码实现
#include <iostream>
#include <vector>
#include <algorithm>
#include <memory>  // 智能指针支持// 主题接口 --------------------------------------------------
class WeatherStation; // 前向声明class Observer {
public:virtual ~Observer() = default;// 更新方法(推模型:由主题推送数据)virtual void update(float temp, float humidity) = 0;// 更新方法(拉模型:观察者主动获取数据)// virtual void update(const WeatherStation& subject) = 0;
};// 抽象主题 --------------------------------------------------
class Subject {
public:virtual ~Subject() = default;virtual void registerObserver(std::shared_ptr<Observer> o) = 0;virtual void removeObserver(std::shared_ptr<Observer> o) = 0;virtual void notifyObservers() = 0;
};// 具体主题:气象站 -------------------------------------------
class WeatherStation : public Subject {
private:std::vector<std::shared_ptr<Observer>> observers_;float temperature_ = 0.0f;float humidity_ = 0.0f;public:// 注册观察者void registerObserver(std::shared_ptr<Observer> o) override {observers_.push_back(o);std::cout << "[系统] 新的观察者已注册\n";}// 移除观察者void removeObserver(std::shared_ptr<Observer> o) override {auto it = std::remove(observers_.begin(), observers_.end(), o);if(it != observers_.end()) {observers_.erase(it, observers_.end());std::cout << "[系统] 观察者已移除\n";}}// 通知所有观察者(推模型实现)void notifyObservers() override {std::cout << "[系统] 开始通知" << observers_.size() << "个观察者...\n";for(auto& observer : observers_) {observer->update(temperature_, humidity_);}}// 业务方法:更新气象数据void setMeasurements(float temp, float humidity) {this->temperature_ = temp;this->humidity_ = humidity;std::cout << "\n=== 气象站更新数据 ===" << std::endl;notifyObservers();}// 供拉模型使用的数据获取接口float getTemperature() const { return temperature_; }float getHumidity() const { return humidity_; }
};// 具体观察者:手机APP ----------------------------------------
class MobileApp : public Observer {
private:std::string userName_;public:explicit MobileApp(std::string name) : userName_(std::move(name)) {}// 实现更新接口(推模型)void update(float temp, float humidity) override {std::cout << "[手机APP] " << userName_ << "收到更新:"<< temp << "°C, " << humidity << "%\n";// 可以在此添加业务逻辑,如触发界面刷新}
};// 具体观察者:户外大屏 ---------------------------------------
class OutdoorScreen : public Observer {
public:void update(float temp, float humidity) override {std::cout << "[户外大屏] 最新天气:"<< temp << "°C | 湿度 " << humidity << "%\n";// 实际项目可能包含图形渲染逻辑}
};// 客户端使用 ------------------------------------------------
int main() {// 创建主题WeatherStation station;// 创建观察者(使用智能指针管理)auto user1 = std::make_shared<MobileApp>("张三");auto user2 = std::make_shared<MobileApp>("李四");auto screen = std::make_shared<OutdoorScreen>();// 注册观察者station.registerObserver(user1);station.registerObserver(user2);station.registerObserver(screen);// 模拟数据变化station.setMeasurements(25.5, 60);station.setMeasurements(23.0, 65);// 移除一个观察者station.removeObserver(user2);// 再次更新数据station.setMeasurements(20.0, 70);return 0;
}
代码注释解析
  1. 内存管理改进

    • 使用std::shared_ptr智能指针管理观察者对象
    • 防止原始指针可能导致的野指针问题
    std::vector<std::shared_ptr<Observer>> observers_;
    
  2. 推模型 vs 拉模型

    • 当前实现为推模型(直接传递数据)
    • 注释部分展示了拉模型的接口设计
    /* 拉模型实现示例
    void update(const WeatherStation& subject) override {float temp = subject.getTemperature();float humidity = subject.getHumidity();// 使用获取的数据...
    }
    */
    
  3. 观察者类型多样化

    • 实现不同观察者类型(MobileAppOutdoorScreen
    • 展示不同观察者的差异化处理逻辑
  4. 安全移除机制

    • 使用std::remove+erase组合安全删除元素
    • 避免迭代器失效问题
    auto it = std::remove(observers_.begin(), observers_.end(), o);
    if(it != observers_.end()) {observers_.erase(it, observers_.end());
    }
    

5. 模式优劣分析

优势:
  • 松耦合:主题无需知道观察者的具体实现
  • 动态订阅:运行时随时添加/移除观察者
  • 广播通信:支持一对多通知机制
劣势:
  • 更新顺序不可控:观察者接收通知的顺序不确定
  • 性能损耗:大量观察者时遍历效率低(可考虑异步优化)

6. 应用场景

  1. GUI事件处理
    • 按钮点击事件通知多个控件
  2. 实时监控系统
    • 传感器数据变化通知多个终端
  3. 发布-订阅系统
    • 消息中间件的核心设计模式
  4. 游戏开发
    • 角色状态变化触发多个UI更新

7. 高级扩展方向

  1. 异步通知

    • 使用线程池处理观察者更新
    // 伪代码示例
    void asyncNotify() {std::vector<std::future<void>> futures;for(auto& observer : observers_) {futures.push_back(std::async([&]{observer->update(...);}));}
    }
    
  2. 事件过滤

    • 添加事件类型参数,实现选择性通知
    enum class EventType { TEMP_CHANGE, HUMIDITY_CHANGE };
    virtual void update(EventType type, float value);
    
  3. 优先级队列

    • 使用优先队列管理观察者
    std::priority_queue<std::shared_ptr<Observer>> pq_;
    

8. 总结

观察者模式通过建立高效的发布-订阅机制,有效降低了系统组件间的耦合度。在实际应用中需要根据具体需求选择推/拉模型,并注意内存管理和线程安全等问题。


文章转载自:

http://5oNiYMhG.gwmnr.cn
http://aZ7JPv8A.gwmnr.cn
http://Eh3sox5u.gwmnr.cn
http://m0ZwXgOK.gwmnr.cn
http://CodpD6Zm.gwmnr.cn
http://VItInmki.gwmnr.cn
http://ds2KN5Mq.gwmnr.cn
http://C5Gob8Wa.gwmnr.cn
http://OcKTKBPZ.gwmnr.cn
http://kYYcWSSf.gwmnr.cn
http://iR60ZxcA.gwmnr.cn
http://pnufkvn6.gwmnr.cn
http://QPSBdYTw.gwmnr.cn
http://Vbm5HR2w.gwmnr.cn
http://0oIBNELR.gwmnr.cn
http://bGXdU569.gwmnr.cn
http://TDz4vNoQ.gwmnr.cn
http://mbSuXlY5.gwmnr.cn
http://BY26IcdN.gwmnr.cn
http://rs0PQMxs.gwmnr.cn
http://v0JUx1gK.gwmnr.cn
http://26980Tdy.gwmnr.cn
http://hoNen630.gwmnr.cn
http://TSun6ksb.gwmnr.cn
http://bwttLGQ5.gwmnr.cn
http://zC46G9i6.gwmnr.cn
http://uKtIxlDN.gwmnr.cn
http://ZqxgX9Ac.gwmnr.cn
http://13a1iwQO.gwmnr.cn
http://XE3hcugu.gwmnr.cn
http://www.dtcms.com/wzjs/652067.html

相关文章:

  • 企业建站套餐价格表汽车制造行业网站模板
  • 网站建设 全网推广wordpress的搭建
  • ps国外教程网站页面设计要会什么
  • 网站建设推广报价单wordpress模板带后台
  • 网站底部加备案号网站建设企划
  • 设计深圳网站制作注册公司流程和费用找哪家
  • 把网站做进微信公众号百度app下载官方免费最新版
  • 营销型网站建设区别做设计图的网站
  • 网站模板模仿网站建设用什么系统好
  • 网站优化方案模板做电子杂志用什么网站
  • 县门户网站建设方案汽车网址大全图片
  • 安康网站建设公司亿网互联
  • 怎么免费建设网站wordpress 4 安装教程
  • 积极推进网站建设网站开发需要学习哪些内容
  • 站点建立网站的方法网站开发流程详细步骤
  • 制作网站用什么代码在线网页传输文件
  • 建设网站 注册与登陆品牌建设费用包括哪些?
  • php商城网站开发网站如何验证登陆状态
  • 为什么网站显示正在建设杭州市富阳区建设局网站
  • 网站编程培训机构排名前十品牌建设最高境界
  • 网站建设后期服务协议2023年重启核酸
  • 百度推广和网站建设推广的区别信息网络工程师
  • 学而思的网站哪里做的来年做啥网站能致富
  • 鹤壁市城市建设投资有限公司网站电脑在局域网做网站
  • 四川住房和建设厅网站建设企业网站优势
  • 上海企业网站建设公司window安装wordpress
  • c2c商城网站建设费用wordpress评论微信登录
  • 韩国封号事件网站建设大学生做推送的网站
  • 做网站需要多少屏谷歌镜像网站怎么做
  • 织梦更换网站模板盐城市建设工程网站