学校课程报名与预约管理系统设计模式选型咨询
嘿,这个场景我刚好参与过类似的校园系统设计,咱们结合你提到的需求和那三个模式来拆解下:
首先,Composite模式是核心框架的基础
你的应用里有大量层次化、可组合的实体:比如「预约」可以是课程预约、教师办公预约、访客会议预约;「资源」可以是教室、办公室;「参与方」有学生、教师、访客。这些实体都有共同的行为(比如被查询、生成报表条目),但又有各自的细节。
用Composite模式可以把它们统一成一个抽象组件(比如BookableEntity),然后:
- 把单个预约、单个房间、单个用户作为叶子组件
- 把「某教室的所有预约」「某教师的所有待处理预约」作为组合组件
这样做最大的好处是:生成报表的时候,你不用区分是遍历课程还是会议,是遍历教室还是办公室,只需要调用统一的generateReportEntry()方法,就能递归遍历所有层级的实体,轻松生成包含所有信息的报表——完美匹配你要的报表需求!
然后,Factory模式解决不同预约的创建痛点
不同角色的预约逻辑差异很大:
- 学生预约课程:需要关联课程ID、教室、学生信息,还要验证课程剩余名额
- 教师预约办公室:只需要选择可用办公室、填写使用时间段
- 访客预约会议:需要关联教师、教师可用的房间、访客信息,还要经过教师确认
如果把这些创建逻辑硬写在业务代码里,会堆满if-else,后续加新预约类型(比如社团活动预约)会非常麻烦。这时候用Factory Method模式就很合适:
- 定义一个抽象的
ReservationFactory接口,包含createReservation()方法 - 为每个角色/预约类型实现具体工厂:
StudentClassFactory、TeacherOfficeFactory、VisitorMeetingFactory - 业务层只需要根据用户类型调用对应的工厂,不用关心内部创建逻辑
这样不仅代码更清晰,扩展性也拉满——以后加新预约类型,只需要新增一个工厂类就行。
Iterator模式:配合Composite的遍历神器
当你用Composite构建了层次化结构后,遍历这些结构就成了刚需(比如报表要遍历所有预约、所有房间)。Iterator模式可以帮你屏蔽不同结构的遍历细节:
- 给Composite的组件实现统一的
createIterator()方法 - 比如
Room类的迭代器可以遍历它的所有预约,User类的迭代器可以遍历该用户的所有预约 - 报表生成逻辑只需要拿到迭代器,逐个处理元素就行,不用管元素是存在数组里还是链表中
而且Iterator和Composite是天生的搭档,用它们配合可以让你的遍历逻辑完全解耦,不用在报表代码里写一堆递归遍历的逻辑。
总结:三个模式互补,搭配使用才是最优解
这三个模式不是互斥的,而是可以完美配合:
- Composite搭建整个应用的实体结构,统一处理所有可预约/可统计的元素
- Factory封装不同预约的创建逻辑,让业务层更简洁
- Iterator简化层次结构的遍历,让报表生成等场景的代码更优雅
如果后续还有需求扩展(比如预约状态通知),还可以再加Observer模式,但目前你提到的需求,这三个模式组合起来完全够用了!
内容的提问来源于stack exchange,提问作者user3185534

