本文档描述了一个在线聊天系统的面向对象设计,重点关注其核心组件和功能。该系统支持用户之间的文本聊天,包括私聊和群聊。它还处理用户管理和好友关系。
本设计旨在实现初始功能,暂不考虑扩展性,重点关注支持基本聊天功能所需的基础架构和类。
来源: solutions/object_oriented_design/online_chat/online_chat.ipynb21-40
在线聊天系统围绕几个关键组件设计,这些组件协同工作以提供消息传递功能
来源: solutions/object_oriented_design/online_chat/online_chat.py5-105
用户管理组件由 UserService 和 User 类组成
UserService 类作为系统中所有用户的中心注册表,提供管理用户及其关系的方法。
主要职责
来源: solutions/object_oriented_design/online_chat/online_chat.py5-24
User 类代表系统中的单个用户,维护其个人资料信息以及与其他用户和聊天的关系。
关键属性
关键方法
来源: solutions/object_oriented_design/online_chat/online_chat.py26-55
聊天系统围绕一个抽象基类 Chat 和两个具体实现:PrivateChat 和 GroupChat 构建。
Chat 类作为所有类型聊天会话的基础,定义了共同属性
来源: solutions/object_oriented_design/online_chat/online_chat.py57-63
PrivateChat 类代表两个用户之间的点对点对话。
主要功能
来源: solutions/object_oriented_design/online_chat/online_chat.py65-71
GroupChat 类代表可以有任意数量参与者的多用户对话。
主要功能
来源: solutions/object_oriented_design/online_chat/online_chat.py73-80
Message 类代表聊天中的单个文本消息。
关键属性
来源: solutions/object_oriented_design/online_chat/online_chat.py82-88
好友请求系统管理用户之间好友连接的创建和处理。
AddRequest 类代表一个用户向另一个用户发送的好友请求。
关键属性
来源: solutions/object_oriented_design/online_chat/online_chat.py90-97
RequestStatus 枚举定义了好友请求的可能状态
来源: solutions/object_oriented_design/online_chat/online_chat.py99-104
此工作流程说明了好友请求从创建到批准/拒绝的生命周期。
此工作流程的实现分布在 UserService 和 User 类中的方法中
User.send_friend_request() 发起好友请求User.receive_friend_request() 接收请求User.approve_friend_request() 或 User.reject_friend_request() 批准或拒绝UserService 通过其自身的好友请求方法维护用户之间的一致性来源: solutions/object_oriented_design/online_chat/online_chat.py16-23 solutions/object_oriented_design/online_chat/online_chat.py44-54
此序列图显示了在私聊中发送消息的过程。
消息传递功能通过以下方式实现
User.message_user()User.message_group()Chat 类层次结构来源: solutions/object_oriented_design/online_chat/online_chat.py38-42 solutions/object_oriented_design/online_chat/online_chat.py57-80
系统使用各种数据结构来维护实体之间的关系
UserService 使用字典来跟踪所有用户
users_by_id: 将用户ID映射到 User 对象UserService
└── users_by_id (dict)
├── user_id_1 → User object 1
├── user_id_2 → User object 2
└── ...
来源: solutions/object_oriented_design/online_chat/online_chat.py7-8
每个 User 对象维护多个字典以跟踪关系
User
├── user_id
├── name
├── pass_hash
├── friends_by_id (dict): Maps friend IDs to User objects
├── friend_ids_to_private_chats (dict): Maps friend IDs to PrivateChat objects
├── group_chats_by_id (dict): Maps group chat IDs to GroupChat objects
├── received_friend_requests_by_friend_id (dict): Maps IDs to AddRequest objects
└── sent_friend_requests_by_friend_id (dict): Maps IDs to AddRequest objects
来源: solutions/object_oriented_design/online_chat/online_chat.py28-36
聊天对象(包括私聊和群聊)存储参与者和消息的信息
Chat (abstract)
├── chat_id
├── users (list): Contains User objects
└── messages (list): Contains Message objects
来源: solutions/object_oriented_design/online_chat/online_chat.py59-62
当前设计侧重于在线聊天系统的核心功能,不涉及扩展性问题。一些关键设计考量包括
以用户为中心的设计: 系统以用户为主要实体进行设计,其他实体(聊天、消息)与用户关联。
灵活的聊天类型: 抽象的 Chat 类允许不同类型的对话,同时共享共同的功能。
好友请求工作流程: 系统包含一个完整的好友请求生命周期,具有多种状态。
基于内存的存储: 当前实现使用 Python 字典和列表将所有数据存储在内存中,这适用于小规模使用,但需要针对生产系统进行调整。
有限的范围: 该设计仅侧重于文本消息传递,不包括媒体共享、已读回执或打字指示器等功能。
来源: solutions/object_oriented_design/online_chat/online_chat.ipynb21-40
虽然当前设计为基本的聊天系统提供了坚实的基础,但未来迭代可以考虑进行多项增强
持久化: 添加数据库集成以持久存储用户、聊天和消息。
实时通信: 实现发布/订阅机制以实现实时消息传递。
通知: 添加对新消息或好友请求通知用户的支持。
媒体支持: 扩展 Message 类以支持除文本之外的不同类型内容。
扩展性考量: 解决处理大量用户和消息的扩展性问题。
安全性: 增强安全功能,包括消息的正确加密和身份验证机制。