C/C++技巧
+ -

C/C++技巧 类的代理

2023-06-06 13 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

0 篇笔记 写笔记

C/C++技巧 类的代理
经常会提到MVC结构,大意就是业务与界面分隔,相互之间的变化受影响。但实际在开发过程中很难做到完全的隔离。记得当年看到过Atl和Wtl的代码,也看过一些 duilib等C++封装的一些工程或代码,各自都有一套相对比较成熟的隔离实现。不过我这里说的是另外一种方法,采用C++虚函数代理的方法来实现。功......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!