请原谅任何和所有新手),
我要执行以下任务:
我有几个类(称为A),它们不断收集来自各种来源(数据库,互联网等)的信息。它们可能包含有关某些主题的潜在大量信息..
我还有一堆类(称为B),它允许我渲染各种图形,如果提供了足够的信息(这里,信息可以像一个或多个浮动值一样简单)。
现在,我必须将这两个东西绑在一起,以便我可以修改哪些信息以最少的更改以哪种形式显示。现在,我正在考虑在这里使用观察者模式,因为它似乎很适合这个问题。但是,我有点卡住了,想要建议。我可以清楚地创建一个“数据源”基类型的类A,它允许订阅者并在有变化时通知订阅者。我还可以创建类型为“观察者”的类B,让他们订阅数据源并收到更改通知。
问题是我不希望我的观察者知道他们正在显示的任何特定类型的信息。例如,如果我想在我的城市中绘制Y轴上的温度和X轴上的时间,并且我有一个2D绘图类(类型B),那么我想避免任何类型的{{1调用。同样,在A类中,我不想打A->GetTemperature ()
或类似的东西......
一个想法是定义一堆枚举或字符串,如NotifyOfTemperatureChange ()
,"temperature"
,"time"
等,然后告诉观察者它应该听什么(类似{{1在这里,我告诉A类它应该从数据源B获得Y轴的单个浮点值,通道“温度”)
这样A就可以"humidity"
。这样,B不需要知道它的绘图信息。然后可以说A->SetYAxis (B, "temperature")
。然而,对我来说,这似乎有些苛刻...例如,数据是否会实际传递给通知函数?我必须做这样的事情:
B->subscribeTo (whateverIPassedIn)
或者就像
notifyOfChangesOnThisChannel ("temperature")
此外,B如何知道数据的类型?我的意思是在这个例子中它是一个浮点数,但是如果它是一个int或一个双?
我想我的问题是:这是对的吗?有没有更好的方法来解决这个问题?
提前谢谢
答案 0 :(得分:3)
您可以通过制作观察者模板类来解决此问题。然后,您必须定义一个可以调用的最小接口(或实际概念),例如,Fact
,它将定义单个数据项的外观。您还可以定义一个概念AxisDescription
,用于定义轴的描述方式(标签,单位,线性/对数等)。
这是一个简单的例子来说明:
template<class FactType, class AxisType>
class B {
public:
b(AxisType axis); // initialization requires a description of the axis
// called when a new fact is available
void notify(FactType fact);
// called when many fact should be reported
template<class FactIterator>
void notify(FactIterator begin, FactIterator end);
};
FactType
可以像float
或int
一样简单,但也可能更复杂,具体取决于您要对其执行的操作。