5

假设你有一个客户端,并且想分享/同步同型号/对象服务器。这些模型指向彼此,您希望它们在客户端和服务器之间发送/序列化之后始终指向同一个对象。我目前的解决方案大致是这样的:模式/库发送对象通过网络,保持指针

class Person { 
    static Map<Integer,Person> allPeople; 
    int myDogId; 

    static Person getPerson(int key){ 
     return allPeople.get(key); 
    } 

    Dog getMyDog() { 
     return Dog.getDog(myDogId); 
    } 
} 

class Dog { 
    static Map<Integer,Dog> allDogs; 
    int myOwnersId; 

    static Dog getDog(int key) { 
     return allDogs.get(key); 
    } 

    Person getMyOwner() { 
     return Person.getPerson(myOwnersId); 
    } 
} 

但我不是太满意这个解决方案,领域是整数之类的东西。这也应该是一个很常见的问题。所以我在这里寻找的是这个问题的一个名称,一个模式,通用解决方案或者一个库/框架。

+0

btw。我发现静态映射技术的名称叫做[多重模式](http://en.wikipedia.org/wiki/Multiton) – kornfridge 2011-04-27 07:21:27

回答

2

这里有两个问题。

  • 你复制在客户端和服务器的数据(如果是这样,为什么?)或没有一个,另一个,或 数据库代理持有的模型?
  • 每个代理程序如何访问(其/)模型?

如果模型只有一个代理(客户端,服务器,数据库),那么其他代理 需要一种方式来远程查询模型所保持的(例如,对象为各领域的统计员,getter和setter) 在抽象模型实体上操作(例如,模型元素标识符,可能以您已完成的整数形式实现)。

无论谁持有的模型(一个或全部),每个模型可以自然实现。 正常实现中,每个对象都使用普通的对象引用简单地引用其他对象,如同您编写代码时一样,没有任何代理之间共享的想法,而不像您所做的那样是 。

您可以将OBJECTID与每个对象,因为你,但你的应用程序 代码并不需要使用它相关联;只有在引用模型的 的远程副本时才有必要。无论这个objectid是作为一个特殊的 字段,一个哈希表或者是即时计算的每个对象都只是一个实现细节。处理这种

一种方法是计算上即时的OBJECTID。如果在整个模型中存在规范生成树,则可以执行此操作 。在这种情况下,objectid仅仅是从生成树的根到目标的位置 的路径。如果您没有生成树或计算成本太高,您可以在创建对象时指定objectids。

您建议您拥有重复的分布式模型的真正问题 正在使其与两个代理更新它保持最新。如何防止 一个从在同一时间 与其他创建一个对象(分配的OBJECTID),但正在创建的对象是具有相同OBJECTID, 或相同与不同的ObjectID不同?您需要远程锁定 和信号以保持模型同步(这与多个CPU的“高速缓存一致性”为 相同;只需将每个对象视为高速缓存线就行)。它一般解决 的方法是指定谁拥有主副本(也许是整个模型的, 也许模型中的各个对象的),然后发出查询, 读取,读取与 - 意向修改或写入以确保 “独特”整个模型得到更新。

0

我所知道的唯一的解决办法是通过网络发送的完整结构,即狗和人。然后他们最终会指向网络另一侧的正确副本。然而,该解决方案的实施取决于很多情况。例如,当你的包含关系定义一棵树时,你可以不同于这个问题,如果它是一个带有循环的图。

看一看this以获取更多信息。