• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            那誰的技術博客

            感興趣領域:高性能服務器編程,存儲,算法,Linux內核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數據加載中……

            常見設計模式的解析和實現(C++)之十四-Command模式

            作用:
            將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤消的操作.

            UML結構圖:


            解析:
            Comnand模式的思想是把命令封裝在一個類中,就是這里的Command基類,同時把接收對象也封裝在一個類中就是這里的Receiver類中,由調用這個命令的類也就是這里的Invoker類來調用.其實,如果弄清楚了Command模式的原理,就會發現其實它和注冊回調函數的原理是很相似的,而在面向過程的設計中的回調函數其實和這里的Command類的作用是一致的.采用Command模式解耦了命令的發出者和命令的執行者.

            實現:
            1)Command.h
            /********************************************************************
            ????created:????2006/08/04
            ????filename:?????Command.h
            ????author:????????李創
            ????????????????
            http://m.shnenglu.com/converse/

            ????purpose:????Command模式的演示代碼
            ********************************************************************
            */


            #ifndef?COMMAND_H
            #define?COMMAND_H

            class?Command
            {
            public:
            ????
            virtual?~Command()?{}

            ????
            virtual?void?Execute()?=?0;
            }
            ;

            class?Receiver
            {
            public:
            ????
            void?Action();
            }
            ;

            class?Invoker
            {
            public:
            ????Invoker(Command?
            *pCommand);
            ????
            ~Invoker();

            ????
            void?Invoke();
            private:
            ????Command?
            *m_pCommand;
            }
            ;

            class?ConcreateComand
            ????:?
            public?Command
            {
            public:
            ????ConcreateComand(Receiver
            *?pReceiver);
            ????
            virtual?~ConcreateComand();

            ????
            virtual?void?Execute();

            private:
            ????Receiver
            *?m_pReceiver;
            }
            ;

            #endif

            2)Command.cpp
            /********************************************************************
            ????created:????2006/08/04
            ????filename:?????Command.cpp
            ????author:????????李創
            ????????????????
            http://m.shnenglu.com/converse/

            ????purpose:????Command模式的演示代碼
            ********************************************************************
            */


            #include?
            "Command.h"
            #include?
            <iostream>

            void?Receiver::Action()
            {
            ????std::cout?
            <<?"Receiver?Action\n";
            }


            Invoker::Invoker(Command?
            *pCommand)
            ????:?m_pCommand(pCommand)
            {

            }


            Invoker::
            ~Invoker()
            {
            ????delete?m_pCommand;
            ????m_pCommand?
            =?NULL;
            }


            void?Invoker::Invoke()
            {
            ????
            if?(NULL?!=?m_pCommand)
            ????
            {
            ????????m_pCommand
            ->Execute();
            ????}

            }


            ConcreateComand::ConcreateComand(Receiver
            *?pReceiver)
            ????:?m_pReceiver(pReceiver)
            {

            }


            ConcreateComand::
            ~ConcreateComand()
            {
            ????delete?m_pReceiver;
            ????m_pReceiver?
            =?NULL;
            }


            void?ConcreateComand::Execute()
            {
            ????
            if?(NULL?!=?m_pReceiver)
            ????
            {
            ????????m_pReceiver
            ->Action();
            ????}


            ????std::cout?
            <<?"Execute?by?ConcreateComand\n";
            }


            3)Main.cpp
            /********************************************************************
            ????created:????2006/08/04
            ????filename:?????main.cpp
            ????author:????????李創
            ????????????????
            http://m.shnenglu.com/converse/

            ????purpose:????Command模式的測試代碼
            ********************************************************************
            */


            #include?
            "Command.h"
            #include?
            <stdlib.h>

            int?main()
            {
            ????Receiver
            *?pReceiver?=?new?Receiver();
            ????Command
            *??pCommand??=?new?ConcreateComand(pReceiver);
            ????Invoker
            *??pInvoker??=?new?Invoker(pCommand);

            ????pInvoker
            ->Invoke();

            ????delete?pInvoker;

            ????system(
            "pause");

            ????
            return?0;
            }

            posted on 2006-08-04 20:52 那誰 閱讀(3456) 評論(4)  編輯 收藏 引用 所屬分類: 設計模式

            評論

            # re: 常見設計模式的解析和實現(C++)之十四-Command模式   回復  更多評論   

            寫的不錯,正在學習設計模式,寫的非常好,得多向你學習!
            2006-08-28 12:53 | 羅家峰

            # re: 常見設計模式的解析和實現(C++)之十四-Command模式   回復  更多評論   

            不錯,學習中,以后常來你這里學習.謝謝
            2006-08-28 13:01 | 羅家峰

            # re: 常見設計模式的解析和實現(C++)之十四-Command模式   回復  更多評論   

            寫出了command的框架,我覺得command的主要特色在于可以隨處傳遞,可以實現redo和undo,這在有ui的程序里是非常方便的。
            2007-04-13 15:51 | sirguan

            # re: 常見設計模式的解析和實現(C++)之十四-Command模式   回復  更多評論   

            無聲的感謝
            2013-02-25 16:53 | 江湖人
            久久久精品免费国产四虎| 伊人久久大香线蕉av不卡| 久久精品成人免费看| 国产精品美女久久久网AV| 久久亚洲国产成人影院网站| 免费一级做a爰片久久毛片潮| 中文成人久久久久影院免费观看| 国产A级毛片久久久精品毛片| 久久精品夜夜夜夜夜久久| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 亚洲国产欧美国产综合久久| 久久精品人人做人人爽电影蜜月| 亚洲精品高清久久| 香蕉久久夜色精品升级完成| 国产三级观看久久| 韩国免费A级毛片久久| 久久伊人中文无码| 国产精品久久久久久久午夜片 | 久久国产精品无码网站| 一本一道久久综合狠狠老| 日本精品久久久久久久久免费| 国产午夜福利精品久久2021| 国产精品99久久久精品无码| 久久国产成人亚洲精品影院| A狠狠久久蜜臀婷色中文网| 久久婷婷五月综合国产尤物app| 99久久精品无码一区二区毛片| 久久精品亚洲中文字幕无码麻豆| 久久久久99这里有精品10| 青青草国产97免久久费观看| 亚洲伊人久久大香线蕉苏妲己| 久久久久亚洲AV片无码下载蜜桃| 777午夜精品久久av蜜臀| 中文字幕久久精品 | 伊人色综合久久天天人守人婷| 国产精品免费看久久久香蕉 | 亚洲国产高清精品线久久| 久久久久99精品成人片三人毛片| 国产午夜精品理论片久久| 精品久久久久久无码人妻蜜桃| 伊人久久综在合线亚洲2019|