a
This commit is contained in:
@@ -0,0 +1,237 @@
|
||||
# 观察者模式
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [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)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
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<HWND>
|
||||
+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等类的实际应用中,观察者模式有效地管理了界面状态和用户交互。尽管存在一定的线程安全性考虑,但通过临界区保护和线程同步机制,系统能够稳定运行。这种设计模式提高了代码的可维护性和可扩展性,为系统的持续发展奠定了良好基础。
|
||||
Reference in New Issue
Block a user