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

命令模式有点:

a. 较容易的设计一个命令队列

b. 在需要的的情况下,可以较容易的将命令加入日志

c. 允许请求的一方决定是否要否决请求。

d. 可以容易的实现对请求的撤销和重做。

e. 加入具体新的命令类不影响其他的类。

实例:

receiver.h receiver.cpp  实际操作者  烤肉者

#ifndef RECEIVER_H
#define RECEIVER_H class Receiver
{
public:
Receiver();
void action();
}; #endif // RECEIVER_H
#include "receiver.h"
#include <stdio.h> Receiver::Receiver()
{
} void Receiver::action()
{
printf("Receiver action\n");
}

command.h command.cpp 命令抽象

#ifndef COMMAND_H
#define COMMAND_H #include "receiver.h" class Command
{
public:
Command(Receiver *receiver);
void virtual execute()=0; protected:
Receiver *receiver;
}; #endif // COMMAND_H
#include "command.h"

Command::Command(Receiver *receiver)
{
this->receiver = receiver;
}

concretecommand.h concretecommand.cpp 实际命名

#ifndef CONCRETECOMMAND_H
#define CONCRETECOMMAND_H #include "command.h" class ConcreteCommand : public Command
{
public:
ConcreteCommand(Receiver *receiver);
void execute();
}; #endif // CONCRETECOMMAND_H
#include "concretecommand.h"

ConcreteCommand::ConcreteCommand(Receiver *receiver) : Command(receiver)
{
} void ConcreteCommand::execute()
{
receiver->action();
}

invoker.h invoker.cpp

#ifndef INVOKER_H
#define INVOKER_H #include "command.h"
#include <QList> class Invoker
{
public:
Invoker();
void addCommand(Command *command);
void executeCommand(); private:
QList<Command*> *commandList;
}; #endif // INVOKER_H
#include "invoker.h"

Invoker::Invoker()
{
commandList = new QList<Command*>();
} void Invoker::addCommand(Command *command)
{
commandList->push_back(command);
} void Invoker::executeCommand()
{
for(int i=0; i!=commandList->count(); i++)
{
commandList->at(i)->execute();
}
}

main.cpp

#include <QCoreApplication>
#include <QDebug>
#include "invoker.h"
#include "concretecommand.h" int main(int argc, char *argv[])
{
qDebug() << "Command test" ; Receiver *r = new Receiver();
Command *c1 = new ConcreteCommand(r);
Command *c2 = new ConcreteCommand(r);
Invoker *i = new Invoker();
i->addCommand(c1);
i->addCommand(c2);
i->executeCommand();
}

最新文章

  1. 基于.NET平台常用的框架整理(转)
  2. javascript宿主对象之window.frames
  3. C# EventWaitHandle
  4. 字符串(AC自动机):COCI 2015 round 5 divljak
  5. Linux中查看socket状态(转)
  6. postfix+dovecot配置多域名邮件服务器
  7. Java之FilenameFilter接口
  8. PHP实现统计在线人数功能示例
  9. 【Python3爬虫】最新的模拟登录新浪微博教程
  10. [FromBody]与[FromForm]区别
  11. Android : 基于alsa库的音乐播放
  12. docker 运行redis
  13. PCL点云配准(2)
  14. PHP 日期 加减 月数,天数,周数,小时,分,秒等等
  15. WeakValue &amp; StoreValue
  16. gcc支持的一种结构体赋值方式
  17. Reading SketchVisor Robust Network Measurement for Sofeware Packet Processing
  18. Entity Framework Code First使用者的福音 --- EF Power Tool使用记之一(转载)
  19. 安恒杯11月月赛web题目-ezsql详细记录
  20. C# Winform中窗体的美化—— 用IrisSkin轻松实现换肤功能

热门文章

  1. java中高级写法
  2. AjaxPro.2.dll AjaxPro.AjaxMethod 前后台交互
  3. ubuntu 下使用polipo转换HTTP代理
  4. iOS图片无损拉伸
  5. 【v2.x OGE教程 11】 动画编辑器帮助文档
  6. Linux服务器性能日志收集和分析脚本(转)
  7. RabbitMQ与Redis做队列比较
  8. JS 创建对象(常见的几种方法)
  9. Myecplise Tomcat 启动很慢
  10. VC++MFC对话框程序中给对话添加背景图片