C/C++ 如何设计框架

关于软件设计框架的一点个人心得,之前造了一些轮子,发现修修改改,始终没有造的很好!架构能力不行啊!结果还是没有深入理解MVC,MVP,MVVM等的一些概念,后来我发现这些概念真tm让你晕,我去tm的mvvm,这一切的一切不就是为了解耦啊,经过深思再深思,我终于写出如下逻辑,一直对设计框架有点着迷,毕竟能设计出好的框架定是有足够多的开发经验,如何达到解耦性高!

这里写图片描述

1,这种适合在各窗口进入聚合的时候采用!
2,在创建控件的时候不必采用这种方式,除非该控件有相当足够的逻辑写!

总要展示一波代码表示表示

//
class BaseObject
{
public:
    BaseObject(BaseObject*pParent)
    {
        AddObserver(this);
    }

    virtual ~BaseObject()
    {
        for(auto item : m_lstObserver)
        {
            item->RemoveObserver(this);
        }
    }

    void AddObserver(BaseObject *pObj)
    {
        m_lstObserver.push_back(pObj);
    }

    void RemoveObserver(BaseObject *pObj)
    {
        auto item = m_lstObserver.begin();
        for(item ; item!=m_lstObserver.end() ; ++item)
        {
            if(*item == pObj)
            {
                break;
            }
        }
    }

    void NotifyStateChange(int state,long long lparam = 0,void *pParam = nullptr)
    {
        for(auto item : m_lstObserver)
        {
            item->OnActionStateChange(this,state,lparam,pParam);
        }
    }

    virtual void OnActionStateChange(BaseObject * pObjSrc,int state,long long lparam = 0,void *pParam = nullptr)
    {

    }

    virtual void OnDataChange()
    {

    }
    std::list<BaseObject*> m_lstObserver;   //observer list

    virtual void Update(){};
};



class BaseUI : public BaseObject
{
public:
    BaseUI(BaseObject *pParent)
        :BaseObject(pParent)
    {

    }

};
//这上面是基类
///

//we write our code here below!
//UIController中我们只要调Notify--什么的,就直接把理解好的数据,发送UI窗口,交付上层显示
class UI;

class UIController
{
public:
    UIController(UI*pView)
    {
        m_pView = pView;
    }

    void SendEmoji()
    {
        /* no we send to socket !*/
    }

    virtual void OnRecv(char *pData)
    {
        //在这里判断!,如果发送表情成功
        //m_pView->NotifyStateChange(param,param,param);
    }

    UI *m_pView;
};


class UI : public BaseUI
{
public:
    UI(BaseUI *pParent)
    :BaseUI(pParent)
    ,m_ctl(this)
    {

    }

    ~UI()
    {

    }

    void OnClicked()
    {
        m_ctl.SendEmoji();
    }

    virtual void OnActionStateChange(BaseObject * pObjSrc,int state,long long lparam,void *pParam) override
    {
        /*if(pObjSrc == this)
        {
            if(lparam)
            {
                m_emojiUI.show(pParam);
            }
        }*/
    }

    UIController m_ctl;
};

int _tmain(int argc, _TCHAR* argv[])
{
    UI ui(nullptr);
    UI ui2(nullptr);
    ui2.AddObserver(&ui);//ui来观察ui2,ui2的事件都会发一份给ui
    return 0;
}

更多文章:http://blog.csdn.net/what951006?viewmode=contents
powered by: 小乌龟在大乌龟背上~

猜你喜欢

转载自blog.csdn.net/what951006/article/details/79158997