• <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://www.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://www.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://www.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 那誰 閱讀(3454) 評論(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 | 江湖人
            久久香蕉一级毛片| 久久久久久久亚洲精品| 东京热TOKYO综合久久精品| 香港aa三级久久三级| 久久精品视频一| 欧美亚洲国产精品久久蜜芽| 午夜精品久久久久久久无码| 人妻少妇久久中文字幕| 久久丝袜精品中文字幕| 99re久久精品国产首页2020| 亚洲精品无码久久久久AV麻豆| 久久久无码一区二区三区 | 国内精品久久久久影院日本| 精品综合久久久久久88小说| 久久国产精品77777| 亚洲精品无码久久千人斩| 久久久久国产一区二区三区| 国产一级做a爰片久久毛片| 久久精品国产AV一区二区三区| 久久久WWW成人免费精品| 99re这里只有精品热久久| 久久综合给合久久狠狠狠97色69 | 亚洲av伊人久久综合密臀性色 | 久久99精品久久久久久hb无码| 中文精品99久久国产| 精品久久久久久无码免费| MM131亚洲国产美女久久| 久久水蜜桃亚洲av无码精品麻豆| 亚洲欧美日韩久久精品| 色婷婷久久综合中文久久一本| 88久久精品无码一区二区毛片 | 精品熟女少妇aⅴ免费久久| 精品久久久久久综合日本| 久久精品国产亚洲av麻豆小说 | 国产精品久久久久…| 久久夜色精品国产噜噜麻豆| 精品久久人人爽天天玩人人妻| 色妞色综合久久夜夜| 久久亚洲精品无码aⅴ大香| 7777久久久国产精品消防器材| 久久久久亚洲AV无码专区首JN|