# 观察者模式
**本文档引用的文件**
- [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消息映射机制](#mfc消息映射机制)
3. [观察者模式实现分析](#观察者模式实现分析)
4. [自定义消息定义与使用](#自定义消息定义与使用)
5. [消息发送与处理流程](#消息发送与处理流程)
6. [组件间松耦合通信](#组件间松耦合通信)
7. [线程安全性与性能影响](#线程安全性与性能影响)
8. [结论](#结论)
## 引言
本项目采用MFC框架实现了一个地质探测软件系统,通过MFC的消息映射机制实现了观察者模式。该模式允许UI组件通过消息映射注册对特定事件的兴趣,从而实现组件间的松耦合通信。系统通过DECLARE_MESSAGE_MAP宏和AFX_MSG消息处理机制,结合自定义消息WM_SCHEDULE和WM_REFRESH,实现了界面刷新和任务调度等功能。
**Section sources**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L1-L2362)
- [MainFrm.h](file://h/MainFrm.h#L1-L120)
## MFC消息映射机制
MFC消息映射机制是实现观察者模式的核心。在MFC中,DECLARE_MESSAGE_MAP宏用于声明消息映射表,而BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏则用于定义消息映射的具体内容。通过这种机制,UI组件可以注册对特定消息的处理函数。
在MainFrm类中,消息映射的定义如下:
```mermaid
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**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L58-L94)
**Section sources**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L58-L94)
- [MainFrm.h](file://h/MainFrm.h#L19-L97)
## 观察者模式实现分析
观察者模式在本项目中通过消息映射机制实现。UI组件通过消息映射注册对特定事件的兴趣,当事件发生时,系统会自动调用相应的处理函数。
以MainFrm和DevMngFrame为例,它们之间的观察者关系如下:
```mermaid
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**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L323-L324)
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L593-L596)
**Section sources**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L323-L324)
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L593-L596)
## 自定义消息定义与使用
项目中定义了多个自定义消息,用于实现特定的业务逻辑。这些消息在Constant.h文件中定义:
```mermaid
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**
- [Constant.h](file://h/Constant.h#L182-L191)
**Section sources**
- [Constant.h](file://h/Constant.h#L182-L191)
### WM_SCHEDULE消息
WM_SCHEDULE消息用于任务调度,由MainFrm类处理:
```mermaid
flowchart TD
Start([开始]) --> CheckScheduler["检查调度器"]
CheckScheduler --> ExecuteScheduler["执行调度任务"]
ExecuteScheduler --> InvalidateToolbar["无效化工具栏"]
InvalidateToolbar --> ShowToolbar["显示工具栏"]
ShowToolbar --> End([结束])
```
**Diagram sources**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L581-L588)
**Section sources**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L581-L588)
### WM_REFRESH消息
WM_REFRESH消息用于界面刷新,支持多种刷新类型:
```mermaid
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**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L590-L619)
- [Constant.h](file://h/Constant.h#L202-L207)
**Section sources**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L590-L619)
## 消息发送与处理流程
消息的发送与处理流程是观察者模式的关键。系统使用SendMessage和PostMessage函数来发送消息,并通过消息映射机制进行处理。
消息处理流程如下:
```mermaid
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**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L323-L324)
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L593-L596)
**Section sources**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L323-L324)
## 组件间松耦合通信
通过消息映射机制,系统实现了组件间的松耦合通信。各组件通过发送和接收消息进行交互,而不需要直接引用对方。
组件间通信关系如下:
```mermaid
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**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L597-L615)
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L237-L238)
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L87-L89)
**Section sources**
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L597-L615)
## 线程安全性与性能影响
系统的线程安全性和性能影响主要体现在网络操作和消息处理上。NetWorkOper类负责处理网络通信,通过线程安全的机制确保消息的正确传递。
线程安全机制如下:
```mermaid
classDiagram
class CNetWorkOper {
+RegeditRealMsgCall(HWND hWnd)
+UnRegeditRealMsgCall(HWND hWnd)
+ThreadFunction()
+m_listRealHwnd list
+m_realHwndCs CRITICAL_SECTION
}
class CAutoLock {
+CAutoLock(CRITICAL_SECTION* pCs)
+~CAutoLock()
}
CNetWorkOper --> CAutoLock : "使用"
CNetWorkOper --> CRITICAL_SECTION : "保护"
```
**Diagram sources**
- [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp#L343-L364)
- [StdThread.cpp](file://cpp/socket/StdThread.cpp#L1-L228)
**Section sources**
- [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp#L343-L364)
## 结论
本项目通过MFC消息映射机制成功实现了观察者模式。系统使用DECLARE_MESSAGE_MAP宏和AFX_MSG消息处理机制,使UI组件能够注册对特定事件的兴趣。自定义消息WM_SCHEDULE和WM_REFRESH的定义与使用,实现了界面刷新和任务调度功能。通过SendMessage和PostMessage函数,系统实现了组件间的松耦合通信。在MainFrm、DevMngFrame等类的实际应用中,观察者模式有效地管理了界面状态和用户交互。尽管存在一定的线程安全性考虑,但通过临界区保护和线程同步机制,系统能够稳定运行。这种设计模式提高了代码的可维护性和可扩展性,为系统的持续发展奠定了良好基础。