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