zoukankan      html  css  js  c++  java
  • 责任链模式

    #include <iostream>
    
    using namespace std;
    
    class Handler
    {
    private:
        int mMsg;
        Handler *mNextHandler;
    public:
        Handler(int msg) :mMsg(msg), mNextHandler(NULL) {}
        ~Handler() {}
    public:
        virtual void handleMessage(int message) = 0;
    
        int getMessage()
        {
            return mMsg;
        }
    
        Handler *getNextHandler()
        {
            return mNextHandler;
        }
    
        void setNextHandler(Handler *handler)
        {
            mNextHandler = handler;
        }
    };
    
    class MouseHandler : public Handler
    {
    public:
        MouseHandler(int msg) :Handler(msg) {}
        ~MouseHandler() {}
    public:
        virtual void handleMessage(int message)
        {
            cout << "MouseHandler handled the message : " << message << endl;
        }
    };
    
    class CatHandler : public Handler
    {
    public:
        CatHandler(int msg) :Handler(msg) {}
        ~CatHandler() {}
    public:
        virtual void handleMessage(int message)
        {
            cout << "CatHandler handled the message : " << message << endl;
        }
    };
    
    class DogHandler : public Handler
    {
    public:
        DogHandler(int msg) :Handler(msg) {}
        ~DogHandler() {}
    public:
        virtual void handleMessage(int message)
        {
            cout << "DogHandler handled the message : " << message << endl;
        }
    };
    
    void looper(int message, Handler *handler)
    {
        Handler *temp = handler;
    
        while (true)
        {
            if (temp->getMessage() == message)
            {
                temp->handleMessage(message);
                break;
            }
            else if (temp->getMessage() == 0)
            {
                temp->handleMessage(message);
                break;
            }
            else
            {
                if (temp->getNextHandler() != NULL)
                {
                    temp = temp->getNextHandler();
                }
                else
                {
                    cout << "no handler!" << endl;
                    break;
                }
            }
        }
    }
    
    int main(int argc, char const *argv[])
    {
        Handler *mouseHandler = new MouseHandler(1);
        Handler *catHandler = new CatHandler(2);
        Handler *dogHandler = new DogHandler(0);
    
        mouseHandler->setNextHandler(catHandler);
        catHandler->setNextHandler(dogHandler);
    
        looper(2, mouseHandler);
        looper(-1, mouseHandler);
    
        delete dogHandler;
        dogHandler = NULL;
    
        delete catHandler;
        catHandler = NULL;
    
        delete mouseHandler;
        mouseHandler = NULL;
    
        return 0;
    }
  • 相关阅读:
    JS的数据类型(包含:7种数据类型的介绍、数据类型的转换、数据类型的判断)
    使用终端改变MAC默认截图存放地址
    Homebrew的安装及使用
    CSS多列布局(实例)
    CSS中元素各种居中方法(思维导图)
    用CSS伪类制作一个不断旋转的八卦图?
    DOSBOX的简单使用
    5分钟读懂JavaScript预编译流程
    基于栈虚拟机和基于寄存器虚拟机的比较
    js执行可视化
  • 原文地址:https://www.cnblogs.com/chen-cai/p/9773274.html
Copyright © 2011-2022 走看看