C++ C++;消息传递系统的设计模式?

C++ C++;消息传递系统的设计模式?,c++,language-agnostic,design-patterns,C++,Language Agnostic,Design Patterns,我的任务是实现一个用于实时模拟的消息传递系统。此系统中需要存在几种不同类型的消息传递对象,将来可能会添加更多。这些对象表示sim卡中玩家之间的主要通信方式。假设我完全理解自己的需求,则可以通过以下属性定义消息传递对象: 发送协议(玩家可以发送什么消息以及何时发送) 接收协议(玩家可以接收哪些消息以及多久接收一次) 消息格式(所发送数据的结构) 模拟代码目前只支持一种发送和接收协议以及一种消息格式。我的工作是使代码更具可扩展性,以便它能够支持将来对协议和消息结构的更改/添加。第一种方法是为每个

我的任务是实现一个用于实时模拟的消息传递系统。此系统中需要存在几种不同类型的消息传递对象,将来可能会添加更多。这些对象表示sim卡中玩家之间的主要通信方式。假设我完全理解自己的需求,则可以通过以下属性定义消息传递对象:

  • 发送协议(玩家可以发送什么消息以及何时发送)
  • 接收协议(玩家可以接收哪些消息以及多久接收一次)
  • 消息格式(所发送数据的结构)
模拟代码目前只支持一种发送和接收协议以及一种消息格式。我的工作是使代码更具可扩展性,以便它能够支持将来对协议和消息结构的更改/添加。第一种方法是为每个属性定义抽象基类,并让每个消息传递对象由它们的句柄组成。然后,可以将每个消息传递对象编写为协议和格式对象的不同组合。我担心的是,这种设计会很快变得过于普遍化,从而成为维护的噩梦。一想到要筛选十几个文件,只想弄清楚
FooMessaging
到底是如何工作的,我就畏缩不前


我将用C++写这个,但我认为这更是一个一般的设计问题。这里有什么“标准”模式或最佳实践可以应用吗?

好的,我想你是在从G开始做一个从A到Z的过程

首先,您的用例是什么?你想干什么?您正在构建什么样的“消息传递系统”?电子邮件?感应电动机?心灵感应

第二,您从这些用例中获得的领域是什么

现在,经过仔细考虑,你会发现为基础课做ABC很方便。考虑一下,做一个接口(虽然C++中的接口和ABC之间的区别不如其他语言的定义好)。在过去的20年中,基于继承的OO已经产生了很多问题,因此现在界面和聚合已经受到青睐。并不总是更好,但你应该首先想到它们

现在,告诉我与“协议”对应的物理对象是什么?您的意思是对消息流之类的东西进行建模吗?它是一种通讯媒介吗

特别是格式听起来可疑,如果不是立即出错的话:消息格式往往与协议紧密相关

基本上,先退后一点,告诉我们更多你想做什么

更新 啊哈。好吧,看,我们从中得到了很多帮助。首先,你指的是可用操作意义上的“协议”——一种完全合理的用法,但当你把它与TCP和UDP混淆时,就会产生混淆,就像我所做的那样

现在,也就是说,你确实至少有几个选择。在下文中,我使用术语“玩家”来表示sim卡中任何可以发送或接收消息的实体

这里的关键概念是围绕变化的轨迹和非功能需求进行设计。明显的变化轨迹是

  • 在你的意义上,你可以有几个“协议”,如果你有多达三个,你应该计划总是有更多。如果你期望超过两个,那么计划你可以任意多个

  • 您可以使用多种不同的方式格式化消息,例如,JSON、XML或YAML。再一次,如果你期望两个以上,计划你可以任意多个

  • 您可以有几种传输机制。听上去,您至少可以使用UNIX域套接字×共享内存×命名管道,但我的直觉告诉我,您还可以选择本地和远程,这意味着您还可以选择UDP或TCP。肯定不止两个,计划扩展性

备选案文1: 使用代理模式,其中每个协议定义一个接口,该接口必须以多种方式之一实现,具体取决于下面的消息传递格式。玩家宣传他们愿意接收的信息;在他们准备接收消息时,他们构造一些东西,为他们接收的任何特定操作消息调用他们的代码。为了发送,他们构造了一个对象,为他们的接收伙伴播放器实现适当的接口

在封面下,这些对象可以有几个实现,每个实现用于不同的消息传递格式和传输机制

此类系统的示例包括SOM/DSOM a/k/a CORBA和使用远程接口的JavaRMI

备选案文2: 您可以围绕命令模式构建一些东西。每个协议都有一个特定的“send me”实现,您的接收方只知道如何重建发送的对象。命令对象有一个mix-in(multiply-inherited,或在运行时作为对象传递),它知道如何整理和序列化命令对象;您可以有第二个了解传输机制的

通过序列化对象并使用传输机制将序列化表单移动到接收方,可以根据特定协议发送消息。接收方“重新水化”对象,并根据发送的实际类型调用适当的方法


这方面的一个例子是带有可序列化接口的Java RMI,而不是使用Remote。

我认为您应该看看。实际上,它是用java编写的,但是它也有C++客户端的选择,而且文档也很好。
干杯。

我重新编写了我的问题,希望能让它更清楚。我不是在设计消息传递系统本身。相反,我正在寻找一种很好的方法,以便在将来添加新的发送/接收协议和消息格式。是的,在我们的例子中,消息格式确实与protoco不同