可視門禁中的mvc模式
mvc全名是model view controller,是模型(model)-檢視(view)-控制器(controller)的縮寫,一種軟體設計典範,用於組織**用一種業務邏輯和資料顯示分離的方法 。mvc開始是存在於desktop
程式中的,m是指資料模型
,v是指使用者介面
,c則是控制器
,使用mvc的目的是將m和v的實現**分離,從而使同乙個程式可以使用不同的表現形式。
在開發可視門禁專案,我需要將資料邏輯處理和圖形顯示兩部分**分離,這樣利於分工,也利於某個模組的功能轉換,因此找到了mvc模式(如一般開發方式的圖1和mvc開發方式的圖2)。
從功能角度來講,mvc能夠滿足專案的需求了。但mvc既然是屬於專案的架構,那真正的mvc完成的功能絕不僅僅是**分離,而且還應該是針對專案做更周全的**管理。網上google了很多資料,但大多是闡述mvc模式的理念,很少可以直接參考的**。那就只好自己去實現自己的mvc模式了,說是mvc模式,其實更準確理解就是資料處理層(module)和圖形顯示層(view)的資料傳遞。mvc整個**是由三部分組成:(m)module.cpp module.h,(v)view.cppview.h, (c)control.cpp control.h,下面就看怎麼實現的。
1.control是框架的核心,其主要負責建立m與c、v與c的相互函式呼叫介面。
control.h:
#ifndef _control_h_
#define _control_h_
#include "module.h"
#include "view.h"
#include "typedef.h"
class control
virtual ~control() {}
void initcontrol(module* module, view* view);
void initprogram();
void destroyprogram();
view_->handleevent(event, data, param);
} void sendtomodule(int event, int data, void* param)
static control* instance();
private:
module *module_;
view *view_;
static control *control_;
static void handleevent(int event, int data, void *param);
void initmodule();
void initview();
};#endif
如control.h所示,需包含module.h和view.h標頭檔案,因為c->v和c->m的呼叫是直接呼叫m和v的函式,如:
void sendtomodule(int event, int data, void* param) initcontrol函式呼叫module_->setnotify(handleevent);和view_->setnotify(handleevent);這裡的handleevent是control的函式介面,而setnotify是module和view類的成員函式,負責將control的handleevent的函式位址儲存下來,當v->c傳送資訊時,就直接呼叫函式位址。這裡需要定義乙個函式指標變數,然後賦值於它,才能儲存下來。到這裡基本上建立了模組之間的通訊介面。
看一下view.h檔案:
#ifndef _view_h_
#define _view_h_
#include #include "typedef.h"
class view
void setnotify(notify notify)
void sendtocontrol(int event, int data, void *param);
virtual void handleevent(int event, int data, void* param) = 0;
private:
notify notify_;
};#endif /* _view_h_*/
剛才說了需要定義函式指標變數存放control的handleevent,notify_就是這個變數了。另外需要指出的是view模組的函式介面handleevent是乙個純虛函式,也就是專案中實際圖形處理的類需要繼承view這個類,然後實現這個函式。這樣有個好處就是實現了框架部分(mvc)和具體的專案**分離,也可以實現多個圖形類的擴充套件。module部分也是同理。
最後說說怎麼應用了,首先是main啟動mvc,然後呼叫各個模組之間工作。
以可視門禁專案中的門口機為例:main函式只呼叫了doormachine函式,函式如下:
#include "module_door.h"
void doormachine()
首先是newmvc三部分的物件,control在專案中是只有乙份的,所以這裡用了設計模式中的單一模式去生成物件。viewdoor和moduledoor分別是view和module類的派生類。initcontrol函式上面有提到,功能就是建立mvc的通訊介面。initprogram()功能就是分別向viewdoor和moduledoor發出init訊號,初始化各自部分功能,比如viewdoor是載入控制項,顯示第乙個頁面,moduledoor載入系統的一些引數。sendtoview(acce_v_poll, 0, null);就是讓主線程迴圈做某些事。當獲取到程式退出的訊號,執行緒會跳出這個迴圈,執行destroyprogram();也即讓viewdoor和moduledoor做退出處理工作,最後銷毀mvc三個物件。 MVC架構中的模式
mvc的起源自mvc起源於上個世界七十年代後期,trygve reenskaug開發並將之作為 alltalk平台的框架,具體就不細說了.以mvc為架構的系統包含了很多的設計模式,但是與mvc最為密切相關的有兩種模式 observer和 posite,如果業務邏輯不常變化,那麼可以不採用strate...
WinForm中的MVC模式 MVP模式
using system using system.collections.generic using system.linq using system.text using system.componentmodel namespace set private string name public...
php中的MVC模式運用
php中的mvc模式運用 首先我來舉個例子 乙個簡單的文章顯示系統 簡單期間,我們假定這個文章系統是唯讀的,也就是說這個例子將不涉及文章的發布,現在開始了。由於只涉及資料庫的讀取,所以我定義了兩個inte ce inte ce dataoperation 上面這inte ce定義了讀取資料的介面,s...