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

7.9 KiB

观察者模式

**本文档引用的文件** - [MainFrm.cpp](file://cpp/Views/MainFrm.cpp) - [MainFrm.h](file://h/MainFrm.h) - [devmngframe.cpp](file://cpp/Views/devmngframe.cpp) - [devmngframe.h](file://h/devmngframe.h) - [datamngframe.cpp](file://cpp/Views/datamngframe.cpp) - [sptmngframe.cpp](file://cpp/Views/sptmngframe.cpp) - [Constant.h](file://h/Constant.h) - [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp) - [scheduler.cpp](file://cpp/Scheduler/scheduler.cpp) - [StdThread.cpp](file://cpp/socket/StdThread.cpp)

目录

  1. 引言
  2. MFC消息映射机制
  3. 观察者模式实现分析
  4. 自定义消息定义与使用
  5. 消息发送与处理流程
  6. 组件间松耦合通信
  7. 线程安全性与性能影响
  8. 结论

引言

本项目采用MFC框架实现了一个地质探测软件系统,通过MFC的消息映射机制实现了观察者模式。该模式允许UI组件通过消息映射注册对特定事件的兴趣,从而实现组件间的松耦合通信。系统通过DECLARE_MESSAGE_MAP宏和AFX_MSG消息处理机制,结合自定义消息WM_SCHEDULE和WM_REFRESH,实现了界面刷新和任务调度等功能。

Section sources

MFC消息映射机制

MFC消息映射机制是实现观察者模式的核心。在MFC中,DECLARE_MESSAGE_MAP宏用于声明消息映射表,而BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏则用于定义消息映射的具体内容。通过这种机制,UI组件可以注册对特定消息的处理函数。

在MainFrm类中,消息映射的定义如下:

classDiagram
class CMainFrame {
+DECLARE_DYNAMIC(CMainFrame)
+BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
+ON_WM_CREATE()
+ON_COMMAND(IDM_MNG_DATA_WIN, OnMngDataWin)
+ON_COMMAND(IDM_MNG_EXEC_WIN, OnMngExecWin)
+ON_COMMAND(IDM_MNG_DEV_WIN, OnMngDevWin)
+ON_MESSAGE(WM_SCHEDULE, OnSchedule)
+ON_MESSAGE(WM_REFRESH, OnRefresh)
+END_MESSAGE_MAP()
}

Diagram sources

Section sources

观察者模式实现分析

观察者模式在本项目中通过消息映射机制实现。UI组件通过消息映射注册对特定事件的兴趣,当事件发生时,系统会自动调用相应的处理函数。

以MainFrm和DevMngFrame为例,它们之间的观察者关系如下:

sequenceDiagram
participant MainFrm as CMainFrame
participant DevMngFrame as CDevMngFrame
MainFrm->>DevMngFrame : SendMessage(WM_REFRESH_NAV_DEVICE)
DevMngFrame->>DevMngFrame : OnRefreshNavDevice()
DevMngFrame->>MainFrm : SendMessage(WM_SCHEDULE)
MainFrm->>MainFrm : OnSchedule()

Diagram sources

Section sources

自定义消息定义与使用

项目中定义了多个自定义消息,用于实现特定的业务逻辑。这些消息在Constant.h文件中定义:

erDiagram
CUSTOM_MESSAGE {
int WM_SCHEDULE PK
int WM_REFRESH
int WM_NEWLINK
int WM_BREAKLINE
int WM_UPG_GEOMATIVE
int WM_REFRESH_NAV_DEVICE
int WM_SHOW_DEV_UPG_INFO
int WM_CLEAR_DEV_UPG_INFO
}

Diagram sources

Section sources

WM_SCHEDULE消息

WM_SCHEDULE消息用于任务调度,由MainFrm类处理:

flowchart TD
Start([开始]) --> CheckScheduler["检查调度器"]
CheckScheduler --> ExecuteScheduler["执行调度任务"]
ExecuteScheduler --> InvalidateToolbar["无效化工具栏"]
InvalidateToolbar --> ShowToolbar["显示工具栏"]
ShowToolbar --> End([结束])

Diagram sources

Section sources

WM_REFRESH消息

WM_REFRESH消息用于界面刷新,支持多种刷新类型:

classDiagram
class CMainFrame {
+OnRefresh(WPARAM wParam, LPARAM lParam)
}
class RefreshType {
+OP_FILE_IMP
+OP_TD_SYN
+OP_SPT_SYN
+OP_DE_F_D
}
CMainFrame --> RefreshType : "使用"

Diagram sources

Section sources

消息发送与处理流程

消息的发送与处理流程是观察者模式的关键。系统使用SendMessage和PostMessage函数来发送消息,并通过消息映射机制进行处理。

消息处理流程如下:

sequenceDiagram
participant Sender as 发送者
participant MessageQueue as 消息队列
participant Receiver as 接收者
Sender->>MessageQueue : PostMessage()
MessageQueue->>Receiver : 消息入队
Receiver->>Receiver : PeekMessage()
Receiver->>Receiver : TranslateMessage()
Receiver->>Receiver : DispatchMessage()
Receiver->>Receiver : 调用消息处理函数

Diagram sources

Section sources

组件间松耦合通信

通过消息映射机制,系统实现了组件间的松耦合通信。各组件通过发送和接收消息进行交互,而不需要直接引用对方。

组件间通信关系如下:

graph TB
subgraph "主框架"
MainFrm[CMainFrame]
end
subgraph "管理框架"
DevMngFrame[CDevMngFrame]
DataMngFrame[CDataMngFrame]
SptMngFrame[CSptMngFrame]
end
MainFrm --> |WM_REFRESH| DataMngFrame
MainFrm --> |WM_SCHEDULE| DevMngFrame
MainFrm --> |WM_SCHEDULE| SptMngFrame
DevMngFrame --> |WM_SCHEDULE| MainFrm
DataMngFrame --> |WM_REFRESH| MainFrm

Diagram sources

Section sources

线程安全性与性能影响

系统的线程安全性和性能影响主要体现在网络操作和消息处理上。NetWorkOper类负责处理网络通信,通过线程安全的机制确保消息的正确传递。

线程安全机制如下:

classDiagram
class CNetWorkOper {
+RegeditRealMsgCall(HWND hWnd)
+UnRegeditRealMsgCall(HWND hWnd)
+ThreadFunction()
+m_listRealHwnd list<HWND>
+m_realHwndCs CRITICAL_SECTION
}
class CAutoLock {
+CAutoLock(CRITICAL_SECTION* pCs)
+~CAutoLock()
}
CNetWorkOper --> CAutoLock : "使用"
CNetWorkOper --> CRITICAL_SECTION : "保护"

Diagram sources

Section sources

结论

本项目通过MFC消息映射机制成功实现了观察者模式。系统使用DECLARE_MESSAGE_MAP宏和AFX_MSG消息处理机制,使UI组件能够注册对特定事件的兴趣。自定义消息WM_SCHEDULE和WM_REFRESH的定义与使用,实现了界面刷新和任务调度功能。通过SendMessage和PostMessage函数,系统实现了组件间的松耦合通信。在MainFrm、DevMngFrame等类的实际应用中,观察者模式有效地管理了界面状态和用户交互。尽管存在一定的线程安全性考虑,但通过临界区保护和线程同步机制,系统能够稳定运行。这种设计模式提高了代码的可维护性和可扩展性,为系统的持续发展奠定了良好基础。