好的,我怀疑您正在从大约 G 开始进行 A 到 Z 过程。
首先,您的用例是什么?你想做什么?您正在构建什么样的“消息系统”?电子邮件?我是?心灵感应?
其次,您从这些用例中获得的领域是什么?
现在,考虑到这一点,是的,您经常发现为基础课程制作 ABC 很方便。考虑改为创建一个接口(尽管 C++ 中接口和 ABC 之间的区别没有其他语言那么明确。)在过去的 20 年中,基于继承的 OO 已经证明会带来很多问题,因此接口和聚合是现在受到青睐。不是总是更好,但你应该首先想到它们。
现在,告诉我与“协议”相对应的物理事物是什么?您的意思是建模消息流之类的东西吗?它是一种传播媒介吗?
特别是格式听起来很可疑,如果不是立即错误的话:消息格式往往与协议密切相关。
基本上,先备份一下,然后告诉我们更多关于您尝试做什么的信息。
更新
啊哈。好吧,看,我们从中得到了很多帮助。首先,您指的是可用操作意义上的“协议”——一种完全合理的用法,但是当您将它与 TCP 与 UDP 混淆时会混淆,就像我所做的那样。
现在,也就是说,您确实至少有几个选择。在下文中,我使用术语“玩家”来表示 sim 中可以发送或接收消息的任何实体。
这里的关键概念是围绕变化的轨迹和非功能性需求进行设计。明显的变化轨迹是
-
你可以有几个“协议”,如果你有多达三个,你应该计划总是有更多。如果您期望两个以上,请计划您可以拥有任意多个。
-
您可以使用多种不同的方式来格式化消息,例如 JSON、XML 或 YAML。再说一次,如果您期望超过两个,请计划您可以拥有任意多个。
-
您可以有多种传输机制。从表面上看,你至少可以使用 UNIX 域套接字×共享内存×命名管道,但是我的直觉说你也可以选择本地和远程,也就是说你也可以选择 UDP 或 TCP。肯定不止两个,规划可扩展性。
选项1:
使用代理模式,其中每个协议都定义了一个接口,该接口必须以多种方式之一实现,具体取决于底层的消息传递格式。玩家宣传他们愿意接收的信息;在他们准备接收消息时,他们构造了一些东西,为他们收到的任何特定操作消息调用他们的代码。为了发送,他们构建了一个对象,为他们的接收伙伴 Player 实现了适当的接口。
在幕后,这些对象可以有多种实现,每种实现不同的消息格式和传输机制。
这样的系统示例包括 SOM/DSOM a/k/a CORBA 和使用远程接口的 Java RMI。
选项 2:
您可以围绕命令模式构建一些东西。每个协议都有一个特定的“发送我”的实现,你的接收者只知道如何重建一个发送的对象。命令对象有一个混合(多重继承,或在运行时作为对象传递),它知道如何编组和序列化命令对象;您可以拥有第二个了解传输机制的人。
您通过序列化对象并使用您的传输机制将序列化的表单移动到接收方,从而在特定协议上发送消息。接收方“重新水化”对象,并根据发送的实际类型调用适当的方法。
这方面的一个例子是使用 Serializable 接口而不是使用 Remote 的 Java RMI。