• 设计模式学习Chain Of Responsiblity(责任链)


    意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到一个对象处理它为止.

    适用性:

    有多个对象可以处理一个请求,那个对象处理该请求运行时自动确定

    你想在不明确制定接受者的情况下,向多个对象中的一个提交一个请求

    可处理一个请求的对象集合应被动态指定

    示例图:

    image

    示例代码:

    class CHandler
    {
    public:
        CHandler(CHandler* nextHandler);
    public:
        ~CHandler(void);
        public:
        void HandleRequest(CRequest req)
        {
            if(IsMatch(req.GetRequestType()))
            {
                _HandleRequest(req);
            }
            else
            {
                if(m_NextHandler)
                {
                    m_NextHandler->HandleRequest(req);
                }
                else
                {
                    _tprintf(_T("unhandler message/n"));
                }                       
            }
        }
    protected:
        virtual void _HandleRequest(CRequest req) =0;
        virtual bool IsMatch(CRequest::RequestType reqType)=0;
    private:
        CHandler* m_NextHandler;
    };

    //消息处理类处理消息
    class CMessageHandler:public  CHandler
    {
    public:
        CMessageHandler(CHandler* pNextHandler)
        :CHandler(pNextHandler)
        {
       
        }
        public:
        ~CMessageHandler()
        {
        }
        public:
            virtual bool IsMatch(CRequest::RequestType reqType)
        {
            if(reqType == CRequest::eMessage)
            {
                return true;
            }   
            return false;
        }
        virtual void _HandleRequest(CRequest req)
        {
            _tprintf(_T("Message handled/n"));
        }
    };


    //键盘处理类处理键盘消息
    class CKeyHandler:public CMessageHandler
    {
    public:
        CKeyHandler(CHandler* pNextHandler)
            :CMessageHandler(pNextHandler)
        {

        }
    public:
        ~CKeyHandler()
        {
        }
    public:
        virtual bool IsMatch(CRequest::RequestType reqType)
        {
            if(reqType == CRequest::eKey)
            {
                return true;
            }   
            return false;
        }
        virtual void _HandleRequest(CRequest req)
        {
            _tprintf(_T("Key Message handled/n"));
        }
    };

    //处理请求

    class CRequest
    {
    public:
        enum RequestType
        {
            eMessage,
            eKey,
            eMouse,
        };
    public:
        CRequest(CRequest::RequestType reqType);
    public:
        ~CRequest(void);
       
        public:
            CRequest::RequestType GetRequestType()
        {
        return m_ReqType;
        }
    private:
        CRequest::RequestType m_ReqType;
    };

    //调用

    CKeyHandler keyHandler(NULL);
        CMessageHandler messageHandler(&keyHandler);
        CRequest keyReq(CRequest::eKey);
        CRequest msgReq(CRequest::eMessage);
        CRequest mouseReq(CRequest::eMouse);
        messageHandler.HandleRequest(keyReq);
        messageHandler.HandleRequest(msgReq);
        messageHandler.HandleRequest(mouseReq);

    结果

    res

  • 相关阅读:
    jq原创幻灯片插件slideV1.0
    jq原创弹出层折叠效果
    jq实现鼠标经过图片翻滚效果
    开源代码的来源
    名词解析
    Joomla软件的简单介绍
    Java集合类的使用
    笔记
    MySQL基础篇一
    MySQL基础篇一
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/2340733.html
Copyright © 2020-2023  润新知