# 系统设计方法论
用生活化的比喻和表格对比,让你从"背棋谱"进阶到"理解为什么这么走"
前置知识:第一阶段(基础编程)+ 第二阶段(前端优化/后端开发)
阅读指南(初学者必看)
为什么你需要学习系统设计方法论?
你已经会写代码了,但面对一个模糊的需求——"做一个匹配系统"——你可能不知道从何下手。设计模式、DDD、架构模式这些方法论,就是帮你把模糊需求变成清晰架构的工具。
学完本章,你能回答:
- 游戏开发中哪些设计模式最常用?各自解决什么问题?
- DDD 的限界上下文怎么划分游戏系统?
- 分层架构、事件驱动、CQRS、微服务……该选哪个?
本文结构
第一部分:设计模式在游戏中的应用(8个最常用的模式)
第二部分:领域驱动设计(DDD)——从城市规划的角度理解系统设计
第三部分:架构模式——6种常见架构的特点和游戏场景
一、设计模式在游戏中的应用
生活类比:设计模式就像棋谱。新手背棋谱,高手理解为什么这么走。
| 模式 | 游戏应用 | 类比 |
|---|---|---|
| 单例 | GameManager、AudioManager | 一个国家只有一个总统 |
| 对象池 | 子弹、粒子、怪物复用 | 自行车租赁站,还了再借 |
| 观察者 | 事件系统、UI 更新 | 报纸订阅,有新闻就推送 |
| 命令 | 技能系统、回放系统 | 遥控器按钮,按了执行命令 |
| 状态机 | 角色状态、AI 行为 | 红绿灯,红→绿→黄 |
| 策略 | AI 策略、伤害计算 | 出行策略,开车/地铁/走路 |
| 工厂 | 怪物生成、道具创建 | 4S店,说要什么车型就生产什么 |
| 原型 | 怪物克隆、配置复制 | 复印机,一份变多份 |
二、领域驱动设计(DDD)
生活类比:DDD 就像城市规划。先分区域(限界上下文),再定每个区域的建筑规范。
战略设计:
┌──────────────────────────────────────┐
│ 游戏世界 │
├──────────┬───────────┬───────────────┤
│ 战斗上下文 │ 社交上下文 │ 经济上下文 │
│ Battle │ Social │ Economy │
│ Context │ Context │ Context │
├──────────┼───────────┼───────────────┤
│ 匹配上下文 │ 排行上下文 │ 活动上下文 │
│ Match │ Rank │ Activity │
│ Context │ Context │ Context │
└──────────┴───────────┴───────────────┘
战术设计:
- 实体(Entity):有唯一标识 → 玩家、怪物、道具
- 值对象(Value Object):无唯一标识 → 位置坐标、伤害数值
- 聚合根(Aggregate Root):一致性边界 → 玩家(包含背包、装备、属性)
- 领域事件(Domain Event):发生的事 → PlayerLevelUpEvent、ItemUsedEvent
三、架构模式
| 模式 | 特点 | 游戏场景 |
|---|---|---|
| 分层架构 | 层层调用,简单清晰 | 小型游戏,快速开发 |
| 事件驱动 | 异步解耦,扩展性好 | 游戏内事件系统 |
| CQRS | 读写分离,查询优化 | 排行榜(写少读多) |
| 事件溯源 | 状态 = 事件回放 | 战斗回放、审计日志 |
| 微服务 | 服务独立部署 | 大型游戏,团队并行 |
| Actor 模型 | 每个实体独立线程 | 房间服务器(Skynet) |
自问自答
Q:设计模式是不是越多越好? A:不是。设计模式是解决特定问题的工具,不是炫技的手段。过度使用设计模式会让代码变得复杂难懂。原则:简单问题用简单方案,只有当问题确实复杂时才引入对应模式。
Q:DDD 的限界上下文和微服务的服务边界是什么关系? A:限界上下文是业务概念的划分,微服务是技术实现的拆分。理想情况下一个限界上下文对应一个微服务,但实际中可能多个上下文共享一个服务(初期),也可能一个上下文拆成多个服务(规模大了之后)。先做限界上下文划分,再决定是否拆微服务。
Q:为什么游戏开发不像 Web 开发那样普遍用微服务? A:游戏服务端(尤其是战斗服)对延迟极其敏感,微服务的网络调用开销不可接受。常见做法是:战斗服用单体/Actor模型,运营服用微服务。
Q:观察者模式和事件驱动架构有什么区别? A:观察者模式是代码级别的解耦(一个对象通知多个监听者),事件驱动架构是系统级别的解耦(通过消息队列异步通信)。前者是后者的实现基础,但量级不同。
实践任务
- 任务1:用 DDD 的限界上下文方法,拆解一个你熟悉的游戏(如王者荣耀)的系统边界
- 任务2:用对象池模式实现一个子弹池,对比有无对象池的 GC 表现
- 任务3:用命令模式实现一个技能系统,要求支持技能队列和回放
- 任务4:用观察者模式实现一个事件系统,要求支持事件冒泡和拦截
- 任务5:对比分层架构和事件驱动架构,在同一个游戏场景下的代码组织差异
与其他章节的关联
| 本章内容 | 关联章节 | 关联点 |
|---|---|---|
| 设计模式 | 第10章 游戏架构设计模式 | 第10章是设计模式在游戏架构中的深度应用 |
| DDD 限界上下文 | 第07章 游戏系统设计实战 | 匹配/经济/战斗等系统就是不同的限界上下文 |
| 事件驱动 | 第05章 预测与回滚 | 回滚机制依赖事件/状态快照 |
| Actor 模型 | 第03章 帧同步 | 房间服务器用 Actor 模型管理帧同步 |
| 状态机 | 第10章 游戏架构设计模式 | 第10章详解状态机与行为树 |