主动模式在大型服务系统中,是完全必须的。在设计模式中,有个监听模式可以概括这种情况,而不完全如此。在监听模式中,往往需要先往目标注册,然后 根据目标的状态变化,由目标通知监听者。但在这里,监听者却并不知道需要监听哪些东西。也就是说监听者和被监听者之间往往没有固定和必然的联系。
我 们可以想象,当一个人进入白骨荒野,这是个眼界很开阔的地图,对于你的进入,已经在白骨荒野的人应该可以看到你的存在,而事实上,他们并不会向你注册他是 否监听你,你也不需要监听他的存在。之所以我们举这个例子,是因为白骨荒野比较大。任何一个进入这个地区的人来说,他不可能知道所有在这个地区的人,注册 就无从说起了。
这是个很矛盾的事情,因为对于你和一个你并不知道的人来说,你们两个的关系并不是由你们自己决定的,而是由你们同处于一个视野这个事实决定的。因此我们需要一个管理器,负责模拟生成客观世界需要生成的事实,就像进入视野这种事情。我们在前面的讨论过程,有个很重要的原则,就是减少关联性,比如N个实体之间,关联性将为(N-1)^2,如果存在一个管理器,那么实体之间只有N个关联。
我们假设白骨荒野有个事件管理器,那么当所有进入白骨荒野的人,都会向管理器注册,由管理器判断并且产生事件。我感觉这个模式有些问题,但还没有仔细研究。从理论上来说,应该具有很好的优点,很简单,这种方式减少了关联度,必然减少由此引起的计算量,可同样会导致复杂度。
我们在前面讨论过数据抽象的事情,试图将所有的实体抽象并表格化,同时还会每个字段绑定一个函数,这个函数可能会被外界驱动,比如客户端的键盘操作。当一个角色行走时,那么行走函数会被调用,新的坐标可以通过这个函数通知给管理器,这种方法让我们在很高的实时性以及很小的粒度上获取主动性。
管理器的存在是个很麻烦的事情,因为他具备全局属性,给我们试图将所有局部化的理论带来很大的颠覆,同样的,管理器为我们提供方便的主动模式。
考虑暴风城和闪金镇2个分区,我们无法假设他们具备同一个管理器,因为这样会导致我们必须假设西部荒野也使用这个管理器,以致于整个世界都是用相同的管理器。为了更变态一点,我们将白骨荒野切割成2个分区AB,在分区的边缘各站1个人P1/P2,显然,管理器模式无法解决这种情况,因为一个分区的管理器无法知道另外一个分区的信息。P1就站在P2面前,却不知道P2在转身,显然很荒谬。
这里有2个方案,方案1是让分区管理器将某些事件向周围进行广播,需要广播哪些事件,由分区管理器决定,这个方案使得管理器是扁平的,但可能导致广播风暴。
方案2是在分区管理器之上,建立一个公共的父管理器,由父管理器负责决定向哪些分区发播哪些事件。这个方案可以降低事件广播的量,但管理器就比较多,呈树状结构。个人感觉方案2更具竞争力,可以更多架构上的好处。
原文链接:https://www.f2er.com/javaschema/287810.html