对MVC模式的个人理解
MVC模式并不是java语言所特有的设计思想,也不是web应用所特有的思想,它是所有面向对象语言应该遵守的规范。
MVC将一个应用分为三部分:Model(模型)、View(视图)、Control(控制),笔者对mfc比较熟悉,其实在mfc中也有mvc,只不过叫法不太一样:
模型:CDoc
视图:CView
控制:CDocManager
这样做的目的就是在各部分协同工作的同时减少耦合,从而提高应用的可维护性、可扩展性。这就好比盖楼房,采用分层的思想,可以不断向上扩展(盖楼层),试想,同样是为了增加房间数量,如果仅在一个假想的无限大的空间上想蜂房一样盖,那是多么复杂啊!
在经典的mvc模式中,事件由控制器处理,控制器根据事件的类型改变视图和模型。每个模型对应一系列的视图,这种对应关系通常通过注册来完成。
对应的mfc代码为:
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MDITESTYPE,
RUNTIME_CLASS(CMdiTestDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CMdiTestView));
AddDocTemplate(pDocTemplate);
我们在看看AddDocTemplate函数做了些什么?将模版添加到哪里了?
void CWinApp::AddDocTemplate(CDocTemplate* pTemplate) { if (m_pDocManager == NULL) m_pDocManager = new CDocManager; m_pDocManager->AddDocTemplate(pTemplate); }
哦,原来将doctemplate添加到docmanager中了再看看这个docmanager中有啥“数据”:
protected:
CPtrList m_templateList; int GetDocumentCount(); // helper to count number of total documents public: static CPtrList* pStaticList; // for static CDocTemplate objects static BOOL bStaticInit; // TRUE during static initialization static CDocManager* pStaticDocManager; // for static CDocTemplate objects
有指针链表,是用来存储doctemplate的。这下看来,docmanager对应于mvc中的“控制器”。