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

怎么用ip地址做网站怀化市住房和城乡建设局网站

怎么用ip地址做网站,怀化市住房和城乡建设局网站,上海市网站建设公司,服装设计80%的人会转行观察者模式 1 简介 观察者模式是观察者对象们通过注册到被观察者对象中,从而使被观察者发生变化时能通知到观察者,避免硬编码,使用写死的代码逻辑调用通知,从而实现解耦效果。 2 基本代码逻辑 观察者 class IObserver { publ…

观察者模式

1 简介

观察者模式是观察者对象们通过注册到被观察者对象中,从而使被观察者发生变化时能通知到观察者,避免硬编码,使用写死的代码逻辑调用通知,从而实现解耦效果。

2 基本代码逻辑

观察者

class IObserver {
public:virtual ~IObserver() = 0;virtual void update(const Type &type) = 0;
};

被观察者(Subject)

class ISubject {
public:virtual ~ISubject() = 0;virtual void attach(IObserver *observer) = 0;virtual void detach(IObserver *observer) = 0;virtual void notify(const Type &type) = 0;
};

具体实现

class ConcreteObserver : public IObserver {
public:void update(const Type &type) override {// ...}
};
class ConcreteSubject : public ISubject {
private:vector<IObserver*> observers_{};public:void attach(IObserver *observer) override {observers_.emplace_back(observer);}void detach(IObserver *observer) override {observers_.erase(std::remove(observers_.begin(), observers_.end(), observer), observers_.end());}void notify(const Type &type) override {for (auto *observer : observers_) {observer->update(type);}}void setAttr(const Type &type) {// ... procnotify(type);}
};

3 拓展:支持多事件类型的分发

当被观察者(Subject)需要处理 多种不同类型的事件,且每种事件需要独立的观察者列表时,可以通过 事件类型区分泛型接口 实现更灵活的设计。
以下是针对多事件场景的优化方案:

设计思路

  1. 事件类型标识
    使用枚举或字符串定义不同的事件类型(如 EventType::WeatherEventType::Temperature)。
  2. 分事件管理观察者
    在基类中用 std::mapstd::unordered_map 维护不同事件对应的观察者列表。
  3. 泛型事件数据传递
    通过模板或基类 EventData 封装不同事件的数据(如温度值、天气描述)。
  4. 类型安全的观察者接口
    为不同事件类型定义专门的观察者接口,或通过 dynamic_cast 实现运行时类型检查。
1. 定义事件类型与数据基类
#include <iostream>
#include <vector>
#include <unordered_map>
#include <string>
#include <memory>// 事件类型枚举
enum class EventType {WeatherUpdate,   // 天气更新TemperatureChange, // 温度变化// 可扩展更多事件类型...
};// 事件数据基类(泛化数据传递)
class EventData {
public:virtual ~EventData() = default;
};
2. 具体事件数据类(按需扩展)
// 天气事件数据
class WeatherData : public EventData {
public:std::string description;explicit WeatherData(const std::string& desc) : description(desc) {}
};// 温度事件数据
class TemperatureData : public EventData {
public:double value;explicit TemperatureData(double val) : value(val) {}
};
3. 观察者接口(支持多事件类型)
class IObserver {
public:virtual ~IObserver() = default;// 统一处理事件的方法(通过类型区分)virtual void onEvent(EventType type, const EventData& data) = 0;
};
4. 被观察者基类(分事件管理观察者)
class Subject {
private:// 按事件类型存储观察者列表std::unordered_map<EventType, std::vector<IObserver*>> observers_;public:virtual ~Subject() = default;// 注册观察者到特定事件类型void attach(EventType type, IObserver* observer) {observers_[type].push_back(observer);}// 注销观察者void detach(EventType type, IObserver* observer) {auto& list = observers_[type];list.erase(std::remove(list.begin(), list.end(), observer), list.end());}// 通知特定事件类型的观察者void notify(EventType type, const EventData& data) {if (observers_.find(type) == observers_.end()) return;for (auto* observer : observers_[type]) {observer->onEvent(type, data);}}
};

5. 具体被观察者实现(例如气象站)

class WeatherStation : public Subject {
public:// 触发天气更新事件void setWeather(const std::string& weather) {WeatherData data(weather);notify(EventType::WeatherUpdate, data);}// 触发温度变化事件void setTemperature(double temp) {TemperatureData data(temp);notify(EventType::TemperatureChange, data);}
};

6. 具体观察者实现(按需订阅事件)

// 天气显示屏(仅关注天气更新)
class WeatherDisplay : public IObserver {
public:void onEvent(EventType type, const EventData& data) override {if (type != EventType::WeatherUpdate) return; // 过滤无关事件const auto& weatherData = dynamic_cast<const WeatherData&>(data);std::cout << "[天气显示屏] 最新天气: " << weatherData.description << std::endl;}
};// 温度报警器(仅关注温度变化)
class TemperatureAlarm : public IObserver {
public:void onEvent(EventType type, const EventData& data) override {if (type != EventType::TemperatureChange) return;const auto& tempData = dynamic_cast<const TemperatureData&>(data);if (tempData.value > 35.0) {std::cout << "[温度报警] 警告!当前温度: " << tempData.value << "°C" << std::endl;}}
};

7. 客户端使用示例

int main() {WeatherStation station;  // 被观察者WeatherDisplay display;  // 观察者1:订阅天气TemperatureAlarm alarm;  // 观察者2:订阅温度// 注册观察者到特定事件station.attach(EventType::WeatherUpdate, &display);station.attach(EventType::TemperatureChange, &alarm);// 触发事件station.setWeather("晴");      // 通知天气观察者station.setTemperature(28.5);  // 通知温度观察者station.setTemperature(37.0);  // 触发报警return 0;
}

关键优化点

  1. 事件类型区分
    通过 EventType 明确划分不同行为,观察者仅处理订阅的事件。
  2. 泛化数据传递
    EventData 基类允许传递任意派生类数据,结合 dynamic_cast 确保类型安全。
  3. 动态扩展性
    添加新事件只需扩展 EventType 和对应的 EventData 子类,无需修改基类。
  4. 精准通知
    每个事件类型独立维护观察者列表,避免无关观察者被调用。

适用场景

  • 多事件系统:如游戏引擎(角色移动、攻击、死亡等事件独立通知)。
  • 模块化监控:不同模块关注系统的不同状态变化。
  • 可配置订阅:允许观察者动态选择关注的事件类型。

文章转载自:

http://wTC0LNZI.nsyzm.cn
http://dBFF0Xjg.nsyzm.cn
http://gNdxlcJs.nsyzm.cn
http://6c8yFGVZ.nsyzm.cn
http://2mU5f8eB.nsyzm.cn
http://hFk4qIja.nsyzm.cn
http://P8r1w1m8.nsyzm.cn
http://dUT4Q0pu.nsyzm.cn
http://oOkFSJ4q.nsyzm.cn
http://sTlF8xtY.nsyzm.cn
http://WVEn5QbT.nsyzm.cn
http://Vqtkxfm0.nsyzm.cn
http://iYW1v4bb.nsyzm.cn
http://YmgHbdv1.nsyzm.cn
http://uJFfkrab.nsyzm.cn
http://pa6rfu0F.nsyzm.cn
http://SQkM9Avr.nsyzm.cn
http://utEDJR2A.nsyzm.cn
http://U7MjqRap.nsyzm.cn
http://dpwCm3lB.nsyzm.cn
http://YTywCbwc.nsyzm.cn
http://pdm4Gn6a.nsyzm.cn
http://GLBi2iVC.nsyzm.cn
http://bRToDONu.nsyzm.cn
http://1ZykajsH.nsyzm.cn
http://5PoGI362.nsyzm.cn
http://P1WF2of2.nsyzm.cn
http://cu59B7t8.nsyzm.cn
http://xxgCW0xQ.nsyzm.cn
http://agCWiwMS.nsyzm.cn
http://www.dtcms.com/wzjs/657395.html

相关文章:

  • 揭阳网站建设维护天马网络 网站建设
  • 透明管理系统网站模板最权威的网站推广设计
  • 网站建设 dw 时间轴网站开发新加坡
  • 长春火车站到龙嘉机场怎么走好用的h5制作软件
  • 工作了应该浏览器哪些网站温州易富信息技术有限公司
  • win10建设网站目录什么是工具型网站
  • 电商网站开发进度表清远网站推广优化公司
  • 三亚网站开发公司哈尔滨自助板建站
  • 怎么创建网站平台赚钱做英文小说网站
  • 张店学校网站建设公司wordpress插件排列
  • 大型企业网站欣赏西安百度首页优化
  • 湘潭做网站选择磐石网络如何建立公司网站账号
  • 企业邮箱注册申请免费注册入口东莞网站优化怎样
  • 佛山网站建设公司怎么选重庆营销网站建设
  • 网站建设怎么开发客户男的女的做那个视频网站
  • 自己做的网站如何上传网上学生个人网站作品
  • 公司网站制作步骤流程图网站建设模板哪里有
  • 北京个人制作网站logo设计在线生成免费下载
  • 谷德设计网站吴中企业建设网站报价
  • 广西建设职业技术学院图书馆网站东莞市招聘信息最新招聘
  • 加盟网站制作做网站工作怀孕
  • 杭州餐饮网站建设南宁cms建站
  • 大丰做网站网站没备案怎么做淘宝客
  • 坪山附近公司做网站建设哪家效益快企业购
  • 网站建设 推荐专业网站建设公司兴田德润放心
  • 如何建设企业网站ppt域名查询ip地址
  • 里面云智能建站佛山市seo推广联系方式
  • 建设 政务数据共享网站网站 做购物车
  • 长春专业网站制作公司义乌网站建设方式
  • 做网站哪个部分陕西专业做网站