C/C++技巧 类的代理
2023-06-06
14
0
经常会提到MVC结构,大意就是业务与界面分隔,相互之间的变化受影响。但实际在开发过程中很难做到完全的隔离。
记得当年看到过Atl和Wtl的代码,也看过一些 duilib等C++封装的一些工程或代码,各自都有一套相对比较成熟的隔离实现。
不过我这里说的是另外一种方法,采用C++虚函数代理的方法来实现。
功能需求
比如说我们有业务和界面以下功能。
- 当业务开启时,创建界面
- 当业务暂停时,隐藏界面
- 当业务恢复时,显示界面
- 当业务停止时,销毁界面。
那我们怎么做呢?肯定是先创建2个类,分别为UI类和业务类
谁需要被代理呢?
谁是事件的产生者,是需要通知另一方的。那么谁就是需要被代理的,需要被代理的方法就是需要通知另一方的事件方法。另一方继承于代理虚函数,实现代理事件产生的回调接口。
由于我们是业务驱动界面的,故创建业务的代表类,此类是与界面通知相关的。我们使UI继承于代理,实现其代理的虚函数。当代理的虚函数在UI中被调用时,就是业务的通知到来。所以代理虚函数的实现就是在UI类的事件回调。
如业务start时,需要通知UI,故实现业务的代理start函数,当start回调函数到来时,我们需要的仅是显示UI.
class CBussiness
{
public:
class Delegate
{
public:
virtual void Start() = 0;
virtual void Stop() = 0;
virtual void Pause() = 0;
virtual void Resume() = 0;
};
private:
Delegate* m_Delegate;
public:
CBussiness(Delegate* Delegate) :m_Delegate(Delegate)
{
}
public:
void Start()
{
printf("Start Bussinessn");
if (m_Delegate != NULL)
{
m_Delegate->Start();
}
}
void Stop()
{
printf("Stop Bussinessn");
if (m_Delegate != NULL)
{
m_Delegate->Stop();
}
}
void Pause()
{
printf("Pause Bussinessn");
if (m_Delegate != NULL)
{
m_Delegate->Pause();
}
}
void Resume()
{
printf("Resume Bussinessn");
if (m_Delegate != NULL)
{
m_Delegate->Resume();
}
}
};
class CUI : public CBussiness::Delegate
{
public:
void CreateUI()
{
printf("CreateUIn");
}
void DesroyUI()
{
printf("DesroyUIn");
}
void ShowUI()
{
printf("show uin");
}
void HideUI()
{
printf("hide uin");
}
public:
void Start()
{
CreateUI();
}
void Stop()
{
DesroyUI();
}
void Pause()
{
HideUI();
}
void Resume()
{
ShowUI();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CUI* pUI = new CUI();
CBussiness* pBussiness = new CBussiness(pUI);
pBussiness->Start();
printf("n");
pBussiness->Pause();
printf("n");
pBussiness->Resume();
printf("n");
pBussiness->Stop();
delete pUI;
delete pBussiness;
return 0;
}
输出结果:
Start Bussiness
CreateUI
Pause Bussiness
hide ui
Resume Bussiness
show ui
Stop Bussiness
DesroyUI
后记
最近个人在看一些C++开源工程的代码,所以边学边总结。虽然过程是痛苦的,不过能学到或者总结一些前人的编程技巧,也是挺开心的。 :blush: 当然写的这些东西可能对某些访者可能比较简单,不过没关系,我们可以交流.当然也欢迎某些访者进行技术分享投稿。tsingchen2008@163.com或者QQ:76230169