在傳統面向過程的程序設計中,往往采用 Input-Processing-Output 模式,這“歸功”於 DOS 操作系統的單任務。當 Windows 圖形界面 OS 出現後,MVC(Model-View-Controller)模型更適合 Windows 圖形界面程序的設計,它將數據處理和數據顯示分離開,使維護,擴展系統更加靈活 。其中,View:負責 顯示數據,它從Model處獲得數據然後顯示。當然,一個Model會有用戶可從不同角度來觀察的多個View。Model:存儲數據以及對數據進行各種運算和處理 。Controller:負責接受用戶輸入,並且把用戶輸入轉換成對 Model 的操作。因此Controller 可能會修改 Model 的數據,當數據修改後,更新 View。其結構示意圖如下:
一直采用MFC編程的朋友可能不太熟悉它,這是因為MFC的文檔視圖結構就是基於MVC的高層結構,這蒙蔽了我們的雙眼。雖然MS替我們做了,我們還是有必要接觸它,以在SDK or 其他地方有的放矢。我做了一個球體演示的例子,其界面如下:
左側兩個表面積和體積Edit讓使用者從文本的角度精確地觀察,我們稱其為TextView。右側為從CStatic派生的CGraphicView,使得人們可直觀地觀察Sphere.對話窗口CMVCSphereDlg是控制器,來獲取用戶的鍵盤輸入(輸入半徑後回車)和在Static上的鼠標點擊與拖動(可動態調整球體半徑並實時反饋球體變化)而CSphere類是模型,存儲了球體半徑和計算表面積,計算體積等處理半徑數據的操作.
現在讓我們詳細看看代碼,來感受下Model,View,Controller之間如何關聯,如何協同工作的。
class CSphere
{
public:
... ....
//更新Graphic-VIEW
BOOL UpdateGraphicView(HWND hWnd,const CRect &rect,BOOL bErase);
//更新Text-VIEW
void UpdateTextView();
//外界Controller的接口:設置球體半徑
void SetRadius(float r);
private:
//球體半徑
float m_fRadius;
//計算球體表面積
float CalculateArea(float radius);
//計算球體體積
float CSphere::CalculateVolumn(float radius);
};