是否应将AccountsHandler重构为客户端专属实例?适用场景解析
两种AccountsHandler设计方案的对比与适用场景
先明确两种方案的核心差异:
- 原方案:一个
AccountsHandler实例管理所有客户端的账户集合,每次操作需传入Client参数 - 修改后方案:每个
Client对应一个专属AccountsHandler实例,实例内部绑定所属客户端,操作无需再传Client
方案一:共享式AccountsHandler(原设计)
代码结构回顾:
public class AccountsHandler { Map<int, Account> accountsList; public void createAccount(Client client, int accountId) {} public void deleteAccount(Client client, int accountId) {} }
核心特点
- 单实例即可覆盖所有客户端的账户管理,内存开销小
- 每次操作必须传入
Client,需要在方法内额外校验操作的账户是否归属该客户端,避免越权 - 天然支持全局维度的账户操作(比如批量统计、跨客户端账户管控)
适用场景
- 后台管理系统:需要统一入口管理全平台用户账户,比如管理员批量冻结账户、统计全平台账户数量
- 资源受限环境:如嵌入式设备、低内存服务,需尽量减少对象实例数量
- 存在跨客户端账户操作需求:比如需要实现账户在不同客户端间的转移、共享功能
方案二:客户端专属AccountsHandler(修改后设计)
代码结构回顾:
public class AccountsHandler { HashMap<int, Account> clientAccountsList; Client client; AccountsHandler(Client client) { this.client = client; } public void createAccount(int accountId) {} public void deleteAccount(int accountId) {} }
核心特点
- 每个客户端对应独立实例,操作无需重复传入
Client,代码更简洁 - 实例与客户端绑定,天然实现数据隔离,从根源避免跨客户端的误操作
- 单个实例仅维护所属客户端的账户,操作时无需考虑其他客户端的数据,逻辑更聚焦
适用场景
- 前端用户会话场景:比如Web应用中,每个登录用户对应一个会话,会话内所有账户操作都针对当前用户,专属处理器更符合业务直觉
- 高并发场景:每个实例独立处理自身客户端的账户,减少共享数据的锁竞争(原方案若操作全局
accountsList需加锁,容易成为性能瓶颈) - 业务逻辑聚焦单个客户端:比如用户个人中心的账户管理模块,所有操作都围绕当前用户展开,专属处理器让代码职责更清晰
内容的提问来源于stack exchange,提问作者Shadow504
相关产品推荐
相关产品推荐

