gpt4 book ai didi

c++ - 将观察者模式实现为 MarketData 观察者

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:24 25 4
gpt4 key购买 nike

我正在 Qt 中开发 GUI 窗体,我想知道如何实现 ObserverPattern。表单可以订阅许多由 tickerId 区分的数据流,当数据流到达时(新报价可用)我的 PosixClient(套接字包装器)触发 notifyObservers()方法结果 update()正在执行的观察者方法。

但是:

这个update()方法是 void update()我需要获取传入的数据记录并绘制它们,计算一些东西,然后使用它们。那么我怎样才能做到这一点,如何将数据记录传递给观察者呢?数据可用于 Observable(从 Observable 派生的 MarketData 对象)。当数据到达时,我将其推送到这个 Observable 中并通知观察者。

void PosixClient::tickPrice( TickerId tickerId, TickType field, double price, int canAutoExecute) {
printf("tradingclient_1: tickPrice: \n");
for(std::vector<boost::shared_ptr<MarketData> >::iterator it=dataRepository.begin();
it!=dataRepository.end(); it++){
if((*it)->tickerId==tickerId){
(*it)->tickPriceData.push_back(tickSizeRecord(field,price,canAutoExecute));
(*it)->notifyObservers();
//TODO: start thread to store incoming data in repository
}
}
}

他们的 void update()然后调用方法。为了从此函数中检索数据,我决定传递一个函数指针 boost::function<>作为回调,Observer 调用这个指向我的 GUI 对象的函数指针,并将来自 observable 的传入数据作为参数。 这是正确的做法吗?

struct MarketData : public QuantLib::Observable {
//public:
MarketData();
MarketData(IB::Contract c, int tickerId):c(c),tickerId(tickerId){}
MarketData(const MarketData& orig);
virtual ~MarketData();
std::vector<IB::Record> tickPriceData; //market data fed in tickPrice
//private:
IB::Contract c;
int tickerId;
};

typedef boost::shared_ptr<MarketData> pMyObservable;
typedef boost::function<void (int tickerId, IB::Record record)> f_action_ptr;

class MarketDataObserver : public QuantLib::Observer{
public:
MarketDataObserver(pMyObservable obs, f_action_ptr ptr)
: observable(obs), f_ptr(ptr){
this->registerWith(observable);
}
MarketDataObserver(const MarketDataObserver &observer)
: Observer(observer),
observable(observer.observable){ // faction_ptr is not copied!
}

void update(){
data=observable->tickPriceData.back();
//printf("new data: %l\n",data.price);
f_ptr(observable->tickerId, data);
}
private:
IB::Record data;
pMyObservable observable;
f_action_ptr f_ptr;
};

请注意:

我知道 Qt signal/slot 机制,但我认为 Qt signal/slot 在这里根本不是解决方案,当我需要动态订阅数据时,绘制它们,在 Qt Form 上显示,然后在 Form 是时删除订阅取消。但也许我错了。我是吗?我要求的是真实的、工作中的例子,来自生活,而不是理论上的争论。

最佳答案

观察者模式的常用 Qt 惯用语确实是信号和槽。让数据源发出信号并将数据作为信号的参数传递。这就是在 Qt 中完成的方式——信号不仅仅用于 GUI 事件。

关于c++ - 将观察者模式实现为 MarketData 观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16776950/

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