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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值