面向对象架构设计核心是理解“谁在用、做什么、怎么变”,先识别读者、图书、借阅记录等真实实体及其职责,按职责驱动类拆分,通过协作关系推导接口依赖,并以最小闭环(如借书流程)验证设计合理性。

从零开始做面向对象架构设计,核心不是一上来就画类图或写代码,而是先理解“谁在用、做什么、怎么变”。它是一套以实体为中心的建模思路,不是语法练习。
先识别真实世界中的关键实体
别急着定义类,先列出系统里真正“存在”且“有行为”的东西。比如做一个图书借阅系统,重点不是“借书功能”,而是:
- 读者(有姓名、学号、可借数量限制)
- 图书(有ISBN、书名、库存状态)
- 借阅记录(有借出时间、应还日期、是否已还)
- 管理员(负责上架、处理逾期)
每个实体天然带属性和动作:读者能“申请借书”,图书能“被借走”,记录能“更新状态”。这些就是未来类的雏形。
用职责驱动类的拆分
一个类只管一件事,而且这件事得是它“自己该干的”。常见误区是把操作塞进工具类或服务类,比如写个“BookService.borrow()”——这其实违背了对象思维。
更自然的设计是让Book自己管理库存,Reader自己检查借阅资格,BorrowRecord自己计算逾期天数。例如:
- Book.hasStock() → 判断能否借出
- Reader.canBorrowMore() → 检查是否超限
- BorrowRecord.isOverdue() → 根据当前时间判断
这样逻辑归属清晰,后续改规则(比如增加信用分限制)只需动对应类,不牵连其他模块。
从协作关系推导接口与依赖
实体之间怎么配合?不是靠“调用函数”,而是靠“发消息”或“委托任务”。比如读者借书,实际流程是:
- 读者问图书:“你还有余量吗?”(调用book.hasStock())
- 读者问自己:“我还能再借几本?”(调用reader.canBorrowMore())
- 都通过后,生成一条新记录,并通知图书“库存减一”
这时你会发现:Reader不需要知道Book怎么扣库存,只要它提供decreaseStock()这个能力就行;同理,BorrowRecord也不该直接改数据库,而应由BookRepository这类仓储负责持久化。
这种“只依赖能力,不依赖实现”的关系,就是接口设计的起点。
用最小闭环验证设计
不必等全部类画完再编码。挑一个最核心的业务流,比如“读者成功借出一本书”,把它涉及的2–3个类先写出来,跑通完整流程:
- 创建Reader实例,设好最大可借数
- 创建Book实例,设好初始库存
- 调用reader.borrow(book),内部完成校验+扣库存+生成记录
- 检查结果是否符合预期(库存减1、记录生成、无异常)
这个闭环跑通了,说明抽象合理、职责清楚、协作顺畅。再逐步加入逾期提醒、预约排队等扩展点,而不是一开始就堆砌继承树或设计模式。










