21.命令模式--Command

 

Command模式:
Command模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

命令模式的优点:第一、他能叫容易的设计一个命令队列;第二、在需要的情况下,可以较容易的将命令记入日志;第三、它允许接收请求的一方决定是否要否决请求;第四、可以容易的实现对请求的撤销和重做;第五、由于加进新的命令具体类不影响其他类,因此增加新的命令类很容易。还有最关键的一点:命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。

Command模式的典型结构图为:
 

Command模式的实现代码如下:

//Reciever.h
#ifndef _RECEIEVER_H_
#define _RECEIEVER_H_
class Receiver
{
public:
    Receiver();
    ~Receiver();
    void Action();
protected:
private:
};
#endif //~_RECEIEVER_H_


//Receiver.cpp
#include "Receiver.h"
#include <iostream>
Receiver::Receiver()
{
}
Receiver::~Receiver()
{
}
void Receiver::Action()
{
    std::cout<<"Receiver action......."<<std::endl;
}


//Invoker.h
#ifndef _INVOKER_H_
#define _INVOKER_H_
class Command;
class Invoker
{
public:
    Invoker(Command* cmd);
    ~Invoker();
    void Invoke();
protected:
private:
    Command* _cmd;
};
#endif //~_INVOKER_H_


// Invoker.cpp
#include "Invoker.h"
#include "Command.h"
#define NULL 0

Invoker::Invoker(Command *pCommand)
: _cmd(pCommand)
{
}
Invoker::~Invoker()
{
    delete _cmd;
    _cmd = NULL;
}
void Invoker::Invoke()
{
    if (NULL != _cmd)
    {
        _cmd->Execute();
    }
}


//Command.h
#ifndef _COMMAND_H_
#define _COMMAND_H_
class Receiver;

class Command
{
public:
    virtual ~Command();
    virtual void Execute() = 0;
protected:
    Command();
private:
};

class ConcreteCommand:public Command
{
public:
    ConcreteCommand(Receiver* rev);
    ~ConcreteCommand();
    void Execute();
protected:
private:
    Receiver* _rev;
};
#endif //~_COMMAND_H_


// Command.h
#include "Command.h"
#include "Receiver.h"
#define NULL 0
#include <iostream>

Command::Command()
{
}

Command::~Command()
{
}


ConcreteCommand::ConcreteCommand(Receiver* pReceiver)
: _rev(pReceiver)
{
}
ConcreteCommand::~ConcreteCommand()
{
    delete _rev;
    _rev = NULL;
}
void ConcreteCommand::Execute()
{
    if (NULL != _rev)
    {
        _rev->Action();
    }
    std::cout << "Execute by ConcreteCommand\n";
}


//main.cpp
#include "Command.h"
#include "Invoker.h"
#include "Receiver.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
    Receiver* rev = new Receiver();
    Command* cmd = new ConcreteCommand(rev);
    Invoker* inv = new Invoker(cmd);
    inv->Invoke();

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值