这个四川麻将项目采用了面向对象编程(OOP)的核心原则,包括封装、继承和多态,同时结合了Go语言的特性和Web应用的架构模式。项目遵循了"单一职责原则"和"关注点分离"的设计思想,使各个模块专注于自己的职责。
主体:代表游戏中的一个玩家实体。
设计思想:
- 封装:将玩家的属性(ID、名称、手牌)和行为(发送消息)封装在一起
- 状态管理:维护玩家的游戏状态(手牌、分数)
- 通信能力:通过WebSocket连接提供与前端通信的能力
type Player struct {
ID string // 唯一标识
Name string // 玩家名称
Conn *websocket.Conn // WebSocket连接
Tiles []string // 玩家手牌
Score int // 玩家分数
}
主体:代表一个麻将游戏房间,是游戏的核心容器。
设计思想:
- 聚合关系:一个房间包含多个玩家(Room与Player是一对多关系)
- 状态机:通过GameState枚举管理房间的不同状态(等待、游戏中、结束)
- 领域逻辑:包含麻将游戏的核心规则和逻辑
- 广播机制:提供向房间内所有玩家或特定玩家发送消息的能力
type Room struct {
ID string // 房间ID
Password string // 房间密码
Players []*Player // 玩家列表
Owner *Player // 房主
GameState GameState // 游戏状态
Tiles []string // 牌堆
DiscardedTiles []string // 弃牌堆
CurrentPlayerIndex int // 当前玩家索引
LastPlayedTile string // 最后打出的牌
}
主体:定义WebSocket通信的消息格式。
设计思想:
- 数据传输对象(DTO):专门用于在系统不同部分之间传递数据
- 类型安全:通过Type字段区分不同类型的消息
- 灵活性:使用interface{}类型的Data字段支持不同结构的消息内容
type Message struct {
Type string // 消息类型
Data interface{} // 消息数据
}
主体:管理所有游戏房间的中央控制器。
设计思想:
- 单例模式:整个应用只需要一个GameManager实例
- 工厂方法:提供创建房间的方法
- 资源管理:负责房间的生命周期管理
- 并发控制:使用互斥锁保护共享资源,确保线程安全
type GameManager struct {
rooms map[string]*model.Room // 房间映射表
mutex sync.RWMutex // 读写锁
}
主体:处理HTTP请求和WebSocket连接的控制器。
设计思想:
- 命令模式:每个Handler处理特定类型的请求
- 依赖注入:通过参数接收GameManager等依赖
- 中介者模式:作为前端和后端服务之间的中介
- 责任链模式:在WebSocket处理中,根据消息类型分发到不同的处理函数
// 函数式编程风格的Handler
func CreateRoomAPIHandler(gameManager *service.GameManager) gin.HandlerFunc {
// 返回一个闭包,捕获gameManager
return func(c *gin.Context) {
// 处理请求逻辑
}
}
主体:各个HTML页面代表不同的用户界面。
设计思想:
- 模板方法模式:使用HTML模板定义页面结构,通过Go模板引擎注入数据
- 组合模式:页面由多个组件(玩家列表、游戏区域、聊天区域等)组成
主体:负责前端交互逻辑的JavaScript文件。
设计思想:
- 观察者模式:通过WebSocket监听服务器事件,并更新UI
- 命令模式:将用户操作封装为命令发送给服务器
- 状态模式:根据游戏状态显示不同的UI元素和启用/禁用不同的操作
- 策略模式:根据不同的消息类型采用不同的处理策略
// 观察者模式的实现
socket.onmessage = function(event) {
const message = JSON.parse(event.data);
handleMessage(message); // 根据消息类型分发到不同的处理函数
};
// 命令模式的实现
function playTile() {
if (isMyTurn && selectedTileIndex !== -1) {
const tile = myTiles[selectedTileIndex];
sendMessage('play_tile', { tile: tile });
}
}
主体:实时双向通信机制。
设计思想:
- 发布-订阅模式:服务器发布事件,客户端订阅并响应
- 异步通信:非阻塞式的消息处理
- 事件驱动:基于事件的编程模型
主体:RESTful风格的HTTP接口。
设计思想:
- 资源导向:API围绕资源(房间、玩家)设计
- 状态转移:通过HTTP方法表示对资源的操作
- 无状态:每个请求包含所有必要信息
-
分层架构:将系统分为模型层、服务层、控制层和视图层,每层有明确的职责
-
依赖倒置原则:高层模块不依赖低层模块,两者都依赖抽象
-
组合优于继承:通过组合不同的对象实现功能扩展,而非继承
-
接口隔离原则:客户端不应依赖它不需要的接口
-
开闭原则:对扩展开放,对修改关闭,通过添加新代码而非修改现有代码来实现新功能
这个四川麻将项目展示了如何在Web应用中应用面向对象设计原则。通过合理的对象设计和职责划分,项目实现了高内聚、低耦合的架构,使得代码易于理解、维护和扩展。每个模块都有明确的职责和边界,通过定义良好的接口进行交互,体现了面向对象设计的精髓。