gpt4 book ai didi

c++ - 不同 Observable 的观察者模式

转载 作者:太空狗 更新时间:2023-10-29 20:57:59 26 4
gpt4 key购买 nike

我想知道处理可能包含不同数据的 Observables 的合适方法是什么。使用天气数据类比:

假设我有不同的气象站记录数据。让我们说湿度,温度和压力。一个站可能只有记录温度的能力,而其他站则所有三个等等。

我想做的是:

  • 观察者指定他们想要记录的数据。比如说,只有温度。
  • Observable 指定了它们可用的数据。
  • 如果观察者和可观察对象都匹配,则数据由可观察对象处理。

这里有几点:参数比 3 多很多。大约 30 个,并且可以增长。我想在我的基础可观察对象中实现 getTemperature()getPressure()getHumidity() 等,并在相关的对象中覆盖它们类。否则它什么都不返回。我还创建了一个 Flags 匿名结构,它是为 Observable 和 Observer 指定的,只有当它们匹配时才会记录数据。

我想知道以下内容:这是最好的设计吗?匹配 Flags 的责任应该由 Observer 承担吗?有没有更优雅的解决方案?

我不一定要查找代码讲义。只是对良好实现的想法。

谢谢!

最佳答案

因为您已经有了 Flags 来标识可以观察到的事物的种类,即

enum Measurement {
Temperature = 0x00001
, Humidity = 0x00002
, Pressure = 0x00004
};

您可以重用它来通过数据识别测量值,而不是通过方法名称识别它们。也就是说,与其把界面做成这样

struct observable {
Measurement provides() {
return Temperature | Humidity | Pressure;
}
double getTemperature() ...
double getHumidity() ...
double getPressure() ...
};

这样做:

struct observable {
Measurement provides() {
return Temperature | Humidity | Pressure;
}
double measure(Measurement measurementId) {
...
}
};

这将为您提供一个统一的界面,观察者和可观察对象完全通过数据匹配。

但是,measure 的所有实现都需要根据看起来像 switch 的数字进行"dispatch",这并不理想。有一个解决方案:您可以在基类中放置一个非虚拟实现,然后使用常规虚拟调度:

struct observable_base {
double measure(Measurement measurementId) {
switch(measurementId) {
case Temperature: return getTemperature();
case Humidity: return getHumidity();
case Pressure: return getPressure();
}
return 0;
}
protected:
virtual double getTemperature() { return 0; }
virtual double getHumidity() { return 0; }
virtual double getPressure() { return 0; }
};

关于c++ - 不同 Observable 的观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28774427/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com