如何在 C++ 中实现观察者设计模式流数据?

Posted

技术标签:

【中文标题】如何在 C++ 中实现观察者设计模式流数据?【英文标题】:How can I implement the observer design pattern streaming data in C++? 【发布时间】:2011-07-30 13:46:26 【问题描述】:

我想将数据从服务器连续(流式传输)发送到客户端,而不需要客户端不断循环并检查任何数据。我认为我相信这是观察者设计模式是对的?这怎么可能?

谁能给我一份我可以用谷歌搜索的东西的清单?观察者模式方面是如何实现的?

谢谢

【问题讨论】:

你看过Boost.Signals2吗? 【参考方案1】:

观察者设计模式与您所描述的略有不同:

请注意,每个观察者都会收到“可观察”对象的通知;因此,如果您有一个持续传输数据的服务器,那么您希望服务器“通知”您吗?您希望服务器通知您什么?它发送给你的每个数据包?每块数据包?

简而言之:不,您不能在客户端/服务器应用程序上实现观察者模式。服务器没有(简单的)方法可以在您的客户端应用程序上调用通知方法,如果您的客户端断开连接,那么它不会从可观察对象中注销。

所以回到你的问题......你受到架构的限制:阻塞套接字(tcp/udp)在你收到数据之前都是通过阻塞来工作的。一旦你收到数据,你必须循环并再次调用receive以不断获取更多数据。另一种方法是使用异步套接字:

http://www.nightmare.com/medusa/async_sockets.html Boost Asynchronous UDP(请注意,我从未使用过它,但它似乎是您可能想要的) 或者只是Google Asynchronous UDP sockets。

异步套接字通信可能与观察者模式一样接近。此外,您想使用 UDP 协议,因为您有流数据,而 UDP 是专门为流数据设计的。如果你不想错过任何数据包(由于 UDP 的不可靠性),那么你可以使用reliable UDP。

【讨论】:

嗨。好吧,也许我不应该提到观察者模式。我希望客户端在服务器发送数据后立即接收数据,而不必每隔这么多秒轮询一次服务器? @Paul,异步套接字可以正常工作,阻塞套接字不应该要求您轮询一段时间(即套接字阻塞,直到有数据要读取)。我会说,您在某个时间段内进行轮询的 99% 的时间都表明“您做错了!” :)【参考方案2】:

您无法为客户端/服务器用例实现观察者模式,因为通信协议完全不同。 (RPC可能适合,但你使用的是TCP)

无论如何,您可以做的是拥有一个专用的 TCP 客户端来接收数据。正是这个 TCP 客户端和你的内部类可以一起实现观察者模式。有了这个,您的班级将不再需要等待(轮询)数据。

沙士

【讨论】:

【参考方案3】:

据我了解,这里主要关注的是客户端应用程序不应被阻止等待来自服务器的数据。为此,您可以创建一个将作用于套接字事件的线程。您可以使用此线程模块注册您的类的上下文,并且每当接收到数据时,此线程模块可以使用注册的上下文进行回调(通知)。

【讨论】:

以上是关于如何在 C++ 中实现观察者设计模式流数据?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在没有动态多态性的情况下在 C++ 中实现状态设计模式?

在组合模式中实现访问者(Visitor)模式

如何在 C++ 中实现强大的数据持久层?

是否有我可以用来在 C++ 中实现 RPC(客户端-服务器)的设计模式

如何通过在 swift 中实现观察者从 Firebase 实时数据库中获取嵌套数据

java 流程式代码适合啥设计模式