7 RoomIDMgr实现
房间的ID是六位数,取值范围是100000-999999,房间ID不能重复,因为字段有限,需要重复利用,所以有必要使用一个专门的类用来分配管理ID的使用。
当然实现起来也很简单
这里使用了一个队列,初始化的时候,将所有的可用ID按顺序填充到队列中,取ID时从队头弹出一个,回收时将其放入队尾。
取用和回收操作,都使用了锁进行线程保护。
这个类本身没什么好说的。一个简单的区间数据分配功能,即使不单独写类,在RoomMgr中增加一个成员变量也能简单的实现。
这里之所以单独提出一个单独的类,主要基于两点考虑:
1、RoomMgr类职责尽量单一;
2、IDMgr后期可能存在需求变动,单独提出便于维护。
需求变动举几个例子:现在取值范围是一个连续的区间,后期可能需要改为几个区间[100000,500000)(800000,999999],预留一部分[500000,800000]专用;或者其中一部分靓号666666,888888需要预留出来,不能系统直接分配;聊天室承载数量有出现瓶颈,需要分布式部署,多个聊天室服务在不同的机器上,但房间ID要统一管理,不能重复。
所以,如果ID分配写到RoomMgr类里,虽然前期省事,后面需求变动时,代码会越写越复杂,越维护越难看,最后重构又由于耦合太高,带来很高的风险。
因此,前期能够预见到的问题,需要在设计之初就将结构设计好,做好功能分离。而职责单一,是一种非常有用的设计原则。
Last updated