• <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 那誰 閱讀(3464) 評論(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 | 江湖人
            久久综合给合久久狠狠狠97色 | 中文字幕久久精品| 99久久精品九九亚洲精品| 久久这里只有精品首页| 国产精品欧美久久久久天天影视| 久久精品一区二区国产| 国内精品久久人妻互换| 精品久久久久久久无码| 国产午夜精品久久久久免费视| 亚洲AV成人无码久久精品老人| 亚洲AV日韩AV永久无码久久| 亚洲中文字幕久久精品无码APP| 亚洲第一极品精品无码久久| 久久妇女高潮几次MBA| 无码精品久久久天天影视| 日日噜噜夜夜狠狠久久丁香五月| 久久久一本精品99久久精品66| 久久99精品久久久久久动态图| 久久成人国产精品| 国产亚洲成人久久| 色妞色综合久久夜夜| 无码人妻久久久一区二区三区 | A狠狠久久蜜臀婷色中文网| 久久91精品国产91久久小草| 国产日韩久久免费影院| 欧美亚洲国产精品久久高清| 国产精品一区二区久久不卡| 亚洲欧美精品伊人久久| 久久精品极品盛宴观看| 精品久久久久久综合日本| 日本精品久久久久影院日本| 亚洲精品高清国产一线久久| 久久久中文字幕| 99久久精品国产一区二区| 九九99精品久久久久久| 久久亚洲国产精品成人AV秋霞 | 婷婷久久久亚洲欧洲日产国码AV| 色综合久久综合网观看| 亚洲精品无码久久久久| 欧美日韩精品久久久免费观看| 久久午夜羞羞影院免费观看|