MVC框架
MVC 就是全名是Model View Controller ,是模型(Model)-视图(View)-控制器(Controller)的缩写。一种软件设计的典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
简洁
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:
Model(模型)表示应用程序核心(比如数据库记录列表)。
View(视图)显示数据(数据库记录)
Controller(控制器)处理输入(写入数据库记录)MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
下面是C++实现单线程下的MVC
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<iterator>
using namespace std;
class Listener
{
public:
Listener(string name):_name(name){}
virtual void handleMessage(int msgid)=0;
public:
string _name;
};
class Listener1 :public Listener
{
public:
Listener1(string name):Listener(name){}
void handleMessage(int msgid)
{
cout<<_name<<" ";
switch(msgid)
{
case 0:
cout<<"hand 0 msg!"<<endl;
break;
case 1:
cout<<"hand 1 msg!"<<endl;
break;
default:
cout<<"recv invalid msg!"<<endl;
break;
}
}
};
class Listener2 :public Listener
{
public:
Listener2(string name):Listener(name){}
void handleMessage(int msgid)
{
cout<<_name<<" ";
switch(msgid)
{
case 0:
cout<<"hand 0 msg!"<<endl;
break;
case 2:
cout<<"hand 2 msg!"<<endl;
break;
default:
cout<<"recv invalid msg!"<<endl;
break;
}
}
};
class Listener3 :public Listener
{
public:
Listener3(string name):Listener(name){}
void handleMessage(int msgid)
{
cout<<_name<<" ";
switch(msgid)
{
case 1:
cout<<"hand 1 msg!"<<endl;
break;
case 3:
cout<<"hand 3 msg!"<<endl;
break;
default:
cout<<"recv invalid msg!"<<endl;
break;
}
}
};
class Observer
{
public:
void registerMsg(Listener *plistener,int msgid)
{
map<int,vector<Listener*>>::iterator it=_obserMap.find(msgid);
if(it==_obserMap.end())
{
vector<Listener*> vec;
vec.push_back(plistener);
_obserMap.insert(make_pair(msgid,vec));
}
else
{
it->second.push_back(plistener);
}
}
void dispatchMsg(int msgid)
{
map<int,vector<Listener*>>::iterator it=_obserMap.find(msgid);
if(it!=_obserMap.end())
{
vector<Listener*>::iterator vit =it->second.begin();
for(;vit!=it->second.end();++vit)
{
(*vit)->handleMessage(msgid);
}
}
}
private:
map<int,vector<Listener*>> _obserMap;
};
int main()
{
Listener *p1=new Listener1("Listener1");
Listener *p2=new Listener2("Listener2");
Listener *p3=new Listener3("Listener3");
Observer obser;
obser.registerMsg(p1,0);
obser.registerMsg(p1,1);
obser.registerMsg(p2,0);
obser.registerMsg(p2,2);
obser.registerMsg(p3,1);
obser.registerMsg(p3,3);
int msgid=0;
while(true)
{
cout<<"msgid:";
cin>>msgid;
obser.dispatchMsg(msgid);
}
return 0;
}