Chain Of Responsibility模式

来源:互联网 发布:匿名发短信软件 编辑:程序博客网 时间:2024/05/22 17:13

    1、作用

    假设存在一个请求以及多个对象。为了使多个对象都有机会处理这个请求,将这些对象连成一条链,并沿着该链传递这个请求,直到有一个对象处理请求为止。

    举一个例子。在《步步惊心》中,假如康熙皇帝在太和殿要召见马尔泰若曦,皇帝得先通知旁边的太监李德全,然后李德全高喊“传马尔泰若曦进谏”,接着站在太和殿外的太监依次高喊“传马尔泰若曦进谏”,直到有一个太监传到马尔泰若曦。在这里中,“召见马尔泰若曦”就是一个请求,而那些太监就是处理该请求的多个对象。请求一直传递直到有对象处理了该请求。

 

    2、结构图

   

    3、Code --C++

    以下代码采用链表形式实现责任者链模式。实现要点有:

    (1)处理者节点是基类,对请求的处理过程在各个派生类中实现。

    (2)将请求丢给处理者链表,由处理者链表负责传递。

 

    // 处理者节点基类

    class CHandlerNode

    {

        public:

            CHandlerNode(CHandlerNode *pNextCHandlerNode = NULL);

            virtual ~CHandlerNode();

        public:

            virtual void HandleRequest() = 0;

        public:

            CHandlerNode *m_pNextCHandlerNode;

    }

 

    // 处理者链类

    class CHandlerChain

    {

        public:

            CHandlerChain();

            ~CHandlerChain();

        public:

            AddHandlerNode(CHandlerNode *pCHandlerNode);

            DestroyHandlerNode();

            void Process(void *Request);

        public:

            CHandlerNode *m_pCHandlerNodeHead;

    }

 

    // 处理者A类

    class CHandlerRuquestA : public CHandlerNode

    {

        public:

            CHandlerRuquestA();

            virtual ~CHandlerRuquestA();

        public:

            virtual void HandleRequest();

    }

 

    // 处理者B类

    class CHandlerRuquestB : public CHandlerNode

    {

        public:

            CHandlerRuquestB();

            virtual ~CHandlerRuquestB();

        public:

            virtual void HandleRequest();

    }

 

    // Main

    void main()

    {

        CHandlerChain ObjCHandlerChain;

        ObjCHandlerChain.AddHandlerNode(::new CHandlerRuquestA());// 处理者A加入链表

        ObjCHandlerChain.AddHandlerNode(::new CHandlerRuquestB());// 处理者B加入链表

        ObjCHandlerChain.Process(void *Request);                  // 处理请求...

        ObjCHandlerChain.DestroyHandlerNode();

    }

 

原创粉丝点击