Files
geomative/GeomativeStudio/.qoder/repowiki/zh/content/开发者指南/核心架构模式/责任链模式.md
T
coco df489d5640 a
2026-07-03 16:05:30 +08:00

10 KiB

责任链模式

**本文档引用的文件** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp) - [DevManager.cpp](file://cpp/Managers/DevManager.cpp) - [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp) - [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp) - [ExecManager.cpp](file://cpp/Managers/ExecManager.cpp) - [Device.cpp](file://cpp/ProblemZone/Device.cpp) - [Constant.h](file://h/Constant.h) - [ProManager.h](file://h/ProManager.h) - [DevManager.h](file://h/DevManager.h) - [HandleProcessor.h](file://h/HandleProcessor.h) - [StateProcessor.h](file://h/StateProcessor.h) - [ExecManager.h](file://h/ExecManager.h)

目录

  1. 引言
  2. 项目结构
  3. 核心组件
  4. 架构概述
  5. 详细组件分析
  6. 依赖分析
  7. 性能考虑
  8. 故障排除指南
  9. 结论

引言

本文档深入剖析责任链模式在Geomative Studio软件中的设备状态管理和任务执行流程中的应用。该系统通过CProManager、CDevManager等管理器形成处理链条,逐级传递和处理设备操作请求。CHandleProcessor和CStateProcessor在状态流转中扮演关键角色,确保请求在链条中按条件传递并适时终止。结合设备连接、任务配置等业务流程,责任链模式实现了关注点分离和灵活的处理逻辑扩展。文档还将通过代码示例说明异常处理和状态回滚的实现方式。

项目结构

Geomative Studio项目采用分层模块化设计,主要分为核心管理器、工具类和问题区域三大模块。核心管理器(Managers)包含CProManager、CDevManager等,负责工程和设备的生命周期管理。工具类(Tools)提供CHandleProcessor和CStateProcessor等通用服务,用于句柄生成和状态转换。问题区域(ProblemZone)则包含具体的业务实体如CDevice。这种结构清晰地分离了关注点,为责任链模式的应用提供了基础。

graph TB
subgraph "核心管理器"
ProManager[CProManager]
DevManager[CDevManager]
ExecManager[CExecManager]
end
subgraph "工具类"
HandleProcessor[CHandleProcessor]
StateProcessor[CStateProcessor]
end
subgraph "问题区域"
Device[CDevice]
end
ProManager --> HandleProcessor
DevManager --> HandleProcessor
ExecManager --> HandleProcessor
ProManager --> StateProcessor
DevManager --> Device
ExecManager --> Device

图源

节源

核心组件

系统的核心组件包括CProManager、CDevManager、CHandleProcessor和CStateProcessor。CProManager负责工程和测区的创建、删除及与设备的同步。CDevManager管理设备的注册、状态更新和在线/离线设备列表。CHandleProcessor提供句柄生成和解析功能,将ID和类型信息编码到32位整数中。CStateProcessor则负责UI状态与内部状态之间的转换。这些组件通过责任链模式协同工作,确保操作请求能够被正确路由和处理。

节源

架构概述

系统采用责任链模式构建了一个分层的处理架构。当用户发起一个设备操作请求时,请求首先被CProManager接收。CProManager根据请求类型,可能需要与CDevManager协作,获取目标设备的句柄和状态。CHandleProcessor负责将设备ID和类型信息编码成唯一的句柄,而CStateProcessor则确保设备的当前状态(如在线、离线、新设备)在UI和内部逻辑之间正确映射。整个链条确保了请求的有序传递和处理。

sequenceDiagram
participant User as "用户"
participant ProManager as "CProManager"
participant DevManager as "CDevManager"
participant HandleProcessor as "CHandleProcessor"
participant Device as "CDevice"
User->>ProManager : 创建工程请求
ProManager->>DevManager : 获取设备句柄
DevManager->>HandleProcessor : 生成设备句柄
HandleProcessor-->>DevManager : 返回句柄
DevManager-->>ProManager : 返回设备对象
ProManager->>Device : 执行设备操作
Device-->>ProManager : 操作结果
ProManager-->>User : 操作完成通知

图源

详细组件分析

CProManager 分析

CProManager是工程管理的核心,负责工程和测区的全生命周期管理。它通过责任链模式与其他组件交互,确保操作的原子性和一致性。

工程创建流程

flowchart TD
Start([开始创建工程]) --> ValidateInput["验证输入参数"]
ValidateInput --> InputValid{"输入有效?"}
InputValid --> |否| ReturnError["返回错误"]
InputValid --> |是| CheckExist["检查工程名是否存在"]
CheckExist --> Exist{"已存在?"}
Exist --> |是| HandleDuplicate["提示名称重复"]
Exist --> |否| InsertDB["插入数据库"]
InsertDB --> CreateDev["在设备上创建工程"]
CreateDev --> Success{"成功?"}
Success --> |是| UpdateSync["更新同步状态"]
Success --> |否| Rollback["回滚数据库事务"]
UpdateSync --> End([工程创建完成])
Rollback --> End
HandleDuplicate --> End
ReturnError --> End

图源

节源

CDevManager 分析

CDevManager负责设备的注册、状态管理和列表维护。它通过责任链模式与CProManager和设备对象交互。

设备状态管理

classDiagram
class CDevManager {
+_ConnectionPtr m_pConnection
+CLinkList<CDevice*> m_devLinkList
+CHandleProcessor m_handleProcessor
+GetDevice(DWORD dwHandle) CDevice*
+GetDevice(CString szDevSN) CDevice*
+InitialDevLinkList() void
+AddDevice(CDevice* const pDev) BOOL
+DeleteDevice(DWORD dwHandle) BOOL
}
class CDevice {
+DWORD m_dwID
+UINT m_uState
+UINT m_uType
+CString m_szDevSN
+CString m_szMacAddress
+SetState(UINT uState) void
+SetID(DWORD dwID) void
}
class CHandleProcessor {
+GenerateHandle(DWORD dwID, UINT uStyle) DWORD
+GetIDFromHandle(DWORD dwHandle) DWORD
+GetStyleFromHandle(DWORD dwHandle) UINT
}
CDevManager --> CDevice : "管理"
CDevManager --> CHandleProcessor : "使用"
CDevice <|-- CDevice : "自身"

图源

节源

CHandleProcessor 和 CStateProcessor 分析

这两个工具类是责任链模式的基础,提供句柄处理和状态转换服务。

句柄处理机制

flowchart LR
ID[设备ID] --> Shift["左移27位"]
Style[类型] --> Shift
Shift --> Combine["与操作"]
Combine --> Handle[32位句柄]
Handle --> Extract["提取"]
Extract --> ID2["ID (低27位)"]
Extract --> Style2["类型 (高5位)"]

图源

节源

依赖分析

系统各组件之间存在明确的依赖关系。CProManager依赖于CDevManager来获取设备信息,两者都依赖于CHandleProcessor进行句柄处理。CStateProcessor被多个管理器使用,以实现状态的统一管理。这种依赖结构形成了一个清晰的责任链,每个组件只关心自己的职责,通过接口与上下游组件通信。

graph LR
ProManager --> DevManager
ProManager --> HandleProcessor
ProManager --> StateProcessor
DevManager --> HandleProcessor
DevManager --> Device
ExecManager --> HandleProcessor
ExecManager --> Device

图源

节源

性能考虑

责任链模式的应用对系统性能有重要影响。句柄的生成和解析是轻量级的位运算,对性能影响极小。然而,数据库操作和文件传输是潜在的性能瓶颈。系统通过事务管理确保数据一致性,并在文件传输失败时进行状态回滚。建议在高并发场景下对数据库连接进行池化管理,并优化文件传输协议以减少延迟。

故障排除指南

当系统出现异常时,应首先检查设备状态和网络连接。责任链中的每个环节都应有完善的异常处理机制。例如,CProManager在创建工程时,如果设备操作失败,会回滚数据库事务,确保数据一致性。日志文件(如device_log.txt)是诊断问题的重要依据,应定期检查。

节源

结论

责任链模式在Geomative Studio系统中得到了有效应用,通过CProManager、CDevManager等管理器的协作,实现了设备状态管理和任务执行流程的清晰分离。CHandleProcessor和CStateProcessor作为基础工具,为整个链条提供了可靠的服务。该设计不仅提高了代码的可维护性和可扩展性,还通过事务管理和异常处理机制保证了系统的稳定性和数据一致性。