c++ 責任鏈 設計模式

可以看作GUI框架處理事件的原型,例如點擊按鈕事件,button(window),先處理;如果事件沒有得到處理,再上溯給父panel(window)去處理;如果事件沒有得到處理,再上溯給父frame(window)去處理;如果事件沒有得到處理,最後交給APP實例處理。

#include<iostream>
using std::cout;
using std::endl;


class Handle
{
    Handle* mNextHandle;
public:
    virtual ~Handle() 
    { 
        //delete mNextHandle; mNextHandle = 0; 
    };
    virtual void handleRequest() = 0;
    void setNextHandler(Handle* h) { mNextHandle = h; };
    Handle* getNextHandler() { return mNextHandle; };
protected:
    Handle(Handle* h) { mNextHandle = h; };
    Handle() :mNextHandle(0) {};
};

class HandleA :public Handle
{
public:
    HandleA() {};
    HandleA(Handle* h) :Handle(h) {};
    virtual void handleRequest()override
    {
        if (this->getNextHandler())
        {
            cout << "handleA, call next handler" << endl;
            this->getNextHandler()->handleRequest();
        }
        else
        {
            cout << "handleA, last hanlder" << endl;
        }
    };
};

class HandleB :public Handle
{
public:
    HandleB() {};
    HandleB(Handle* h) :Handle(h){};
    virtual void handleRequest()override
    {
        if (this->getNextHandler())
        {
            cout << "handleB, call next handler" << endl;
            this->getNextHandler()->handleRequest();
        }
        else
        {
            cout << "handleB,last hanlder" << endl;
        }
    };
};

class HandleC :public Handle
{
public:
    HandleC() {};
    HandleC(Handle* h) :Handle(h) {};
    virtual void handleRequest()override
    {
        if (this->getNextHandler())
        {
            cout << "handleC, call next handler" << endl;
            this->getNextHandler()->handleRequest();
        }
        else
        {
            cout << "handleC,last hanlder" << endl;
        }
    };
};

int main()
{
    Handle* h1 = new HandleA();
    Handle* h2 = new HandleB(h1);
    Handle* h3 = new HandleC(h2);

    h3->handleRequest();

    delete h1;
    delete h2;
    delete h3;
    return 0;
}
發佈了39 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章