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