设计模式学习-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;   
};

posted @ 2011-05-14 10:34  Yarkin  阅读(168)  评论(0编辑  收藏  举报