可以看作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;
}