zoukankan      html  css  js  c++  java
  • 设计模式学习Command(命令)

    意图:讲一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作.

    通过将请求本身变成一个对象来使工具箱对象可向未指定的应用对象提出请求

    适用性:

    抽象出待执行的动作以参数化某对象,可以通过回调函数表达这种参数化

    支持取消操作(UnExecute)

    示例图:

    image

    示例代码:

    #pragma once
    #include "Move.h"

    //command基类提供Execute接口
    class CBaseCommand
    {
    public:
        CBaseCommand(void);
    public:
        ~CBaseCommand(void);
        virtual void Execute()=0;
        virtual void UnExecute()
        {
       
        }
    };

    //移动命令
    class CMoveCommand:public CBaseCommand
    {
    public:
        CMoveCommand()
        :CBaseCommand()
        {
       
        }
        ~CMoveCommand()
        {
       
        }
        public:
        virtual void Execute()
        {
            //使用移动操作进行移动
            CMove move;
            move.MoveTo(_T("Left 10 px"));
        }
        virtual void Redo()
        {
            Execute();
        }
        virtual void Undo()
        {
            UnExecute();
        }
        virtual void UnExecute()
        {
            CMove move;
            move.MoveTo(_T("Right 10 px"));
        }
    };

    //使用模板来进行简单命令的执行操作
    //不能支持特殊的操作比如Undo/Redo等
    template <class CReceiver>
    class CSimpleCommand:public CBaseCommand
    {
    public:
        typedef void (CReceiver::* Action)();
        CSimpleCommand(CReceiver* pRec,Action action)
            :CBaseCommand(),m_pRec(pRec),m_action(action)
            {
           
            }
           
            //执行操作
            virtual void Execute()
            {
                (m_pRec->*m_action)();
            }
            private:
            CReceiver* m_pRec;
            Action m_action;   
    };

  • 相关阅读:
    在SQL2000怎樣用動態實現SQL2005的nvarchar(max)功能
    行列互换
    c#+GUI在aspx页面画图
    做网站用UTF8还是GB2312?
    Mvc如何做权限
    表白网
    vs2008保存很慢,提速
    MVC 向View传值
    aspx画图表
    什么是MVC
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/2340732.html
Copyright © 2011-2022 走看看