我正在编写一个应用程序,我需要在其中模拟电力或天然气等资源在以任意方式相互连接的大型对象网络之间的分布。不需要模拟物理。只是当对象请求资源时资源单元的流动。
考虑下图:
ObjA <---> ObjB <---> PwrA <---> ObjF
/\ ObjG
ObjE<---/ \---> PwrB
当Obj对象请求时, Pwr对象可以提供资源电力。我在这里需要模拟的是,如果 ObjA 需要 50 电,它应该向所有连接的对等方发送一条消息,而不关心它去往谁,并且应该只从它直接或间接连接到的对等方取回资源。
我没有在这里模拟延迟或任何东西,因此传输将是即时的。从编程的角度来看,这完全是应用程序本地的(没有真正的网络或类似的东西)。
我在这里的挑战是尝试以模块化和干净的方式对其进行编程。我想避免本地连接节点的巨大列表和关于如何处理消息的大型 ifelse 语句(如果可能)。
我既想实现我的目标,又想学习一些新东西。几周以来,我一直在阅读文章、书籍和编程概念,我认为可能是一个很棒的解决方案是 C# Delegates。
我已经完成了一些原型设计并设法使用 MessageOut Delegate 设置对象,其他连接的对象可以订阅并侦听要处理的传出消息。
这工作得很好,但由于我对这个概念没有经验,我有以下缺点:
- 我不知道如何处理连接对象之间的消息传递的循环引用: 上图中如果ObjB广播消息为电力ObjA,PwrA,PwrB,ObjE会被通知,依次所有处理,然后通知ObjB . 这将反过来通知...等。网络处理这个问题的方式是简单地广播所有端口(监听委托的对象),除了接收它的端口。我怎样才能用代表来实现呢?平面广播是行不通的。
- 倾听代表有效地创建单向沟通。为了实现双向通信,我需要让对象互相监听传出消息。但是如果没有上述内容,它肯定是另一个循环引用吗?