设计模式--命令模式

命令模式是属于对象行为型模式的一种。它的定义是:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,已经可撤销的操作。
命令模式的结构如下:
命令模式结构图
适用性
1 需要用到回调函数的时候,Command是回调函数的一个面向对象的替代品
2 在不同的时刻指定,排列和执行该请求
3 支持取消操作
4 支持修改日志
5 用构建在原语操作上的高层操作构造一个系统,在支持事物的信息系统很常见
协作
1 Clinet创建一个ConcreteCommand对象并指定它的Receiver对象
2 某Invoker对象存储该ConcreteCommand对象
3 改Invoker通过调用Command对象的Excute操作来提交一个请求,如可撤销则在执行操作之前存储当前状态
4 ConcreteCommand对象对调用他的Receiver的一些操作以执行该请求
效果
1 Command模式将调用操作的对象与知道如何实现该操作的对象解耦
2 Command是头等的对象,可像其他的对象一样操作和扩展
3 可以将对多个命令装配成一个命令
4 增加一个新的命令很容易
实现注意
1 一个命令对象应达到何种智能程度
2 支持取消和重做
1 接受者对象
2 接受者上执行操作的参数
3 如果会改变接受者的某些值,还必须存储这些值
3 避免取消操作过程中的错误积累
4 使用C++模板
对于不能被取消和不需要参数的命令,可以使用C++模板来实现

//
#include "stdafx.h"
#include "Waiter.h"
#include "Command.h"
#include "Barbecuer.h"
#include "BakeChickWingCommand.h"
#include "BakeMutton.h"
int _tmain(int argc, _TCHAR* argv[])
{
Barbecuer* boy = new Barbecuer;
Command* bakeMutton = new BakeMutton(boy);
Command* bakeWing = new BakeChickWingCommand(boy);
Command* bakeWing1 = new BakeChickWingCommand(boy);
Waiter* girl = new Waiter;
girl->setOrder(bakeWing);
girl->notify();
girl->setOrder(bakeWing1);
girl->notify();
girl->setOrder(bakeMutton);
girl->notify();
return 0;
}
/************************************************************************
          @fileName:Command.h 
          @function: 命令模式的抽象命令接口类
          @author: jaime
          @ver: 1.0.0
************************************************************************/
#pragma once
#include "Barbecuer.h"
class Command
{
public:
Command(Barbecuer* receiver);
~Command();
virtual void excuteCommand() = 0;
private:
protected:
Barbecuer* m_receiver;
};
#include "Command.h"
Command::Command(Barbecuer* receiver)
:m_receiver(receiver)
{
}
Command::~Command()
{
}
/************************************************************************
            @fileName:BackChickWingCommand.h 
            @function: 命令模式的具体命令
            @author: jaime
            @ver: 1.0.0
************************************************************************/
#pragma once
#include "Command.h"
class BakeChickWingCommand : public Command
{
public:
BakeChickWingCommand(Barbecuer* receiver);
~BakeChickWingCommand();
virtual void excuteCommand();
private:
};
#include "BakeChickWingCommand.h"
BakeChickWingCommand::BakeChickWingCommand(Barbecuer* receiver)
:Command(receiver)
{
}
BakeChickWingCommand::~BakeChickWingCommand()
{
}
void BakeChickWingCommand::excuteCommand()
{
m_receiver->bakeChickenWing();
}
/************************************************************************
          @fileName:BakeMutton.h 
          @function: 命令模式的发出命令执行者
          @author: jaime
          @ver: 1.0.0
************************************************************************/
#pragma once
#include "Command.h"
class BakeMutton : public Command
{
public:
BakeMutton(Barbecuer* receiver);
~BakeMutton();
virtual void excuteCommand();
private:
};
#include "BakeMutton.h"
#include <iostream>
using namespace std;
BakeMutton::BakeMutton(Barbecuer* receiver)
:Command(receiver)
{
}
BakeMutton::~BakeMutton()
{
}
void BakeMutton::excuteCommand()
{
m_receiver->bakeMutton();
}
/************************************************************************
          @fileName:Barbecuer.h 
          @function: 命令模式的具体执行者
          @author: jaime
          @ver: 1.0.0
************************************************************************/
#pragma once
class Barbecuer
{
public:
Barbecuer();
~Barbecuer();
void bakeMutton();
void bakeChickenWing();
private:
};
#include "Barbecuer.h"
#include <iostream>
using namespace std;
Barbecuer::Barbecuer()
{
}
Barbecuer::~Barbecuer()
{
}
void Barbecuer::bakeMutton()
{
cout << "考羊肉串" << endl;
}
void Barbecuer::bakeChickenWing()
{
cout << "烤鸡翅" << endl;
}
/************************************************************************
           @fileName:Waiter.h 
           @function: 命令模式的具体发出命令者
           @author: jaime
           @ver: 1.0.0
************************************************************************/
#include "Command.h"
class Waiter
{
public:
Waiter();
~Waiter();
void setOrder(Command* command);
void notify();
private:
Command* m_command;
};
#include "Waiter.h"
Waiter::Waiter()
{
}
Waiter::~Waiter()
{
}
void Waiter::setOrder(Command* command)
{
m_command = command;
}
void Waiter::notify()
{
m_command->excuteCommand();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值