大话设计模式--命令模式 Command -- C++实现实例
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();
}
大话设计模式--命令模式 Command -- C++实现实例的更多相关文章
- linkin大话设计模式--命令模式
linkin大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...
- 设计模式 - 命令模式(command pattern) 多命令 具体解释
命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...
- 设计模式 - 命令模式(command pattern) 具体解释
命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...
- 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释
命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...
- 设计模式-命令模式(Command)
关注公众号 JavaStorm 获取更多成长. 大约需要6分钟读完.建议收藏后阅读. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日 ...
- 设计模式--命令模式Command(对象行为型)
一.命令模式 将一个请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. (1)Command类:是一个抽象类,类中对需要执行的命令进行 ...
- C#设计模式——命令模式(Command Pattern)
一.概述通常来说,“行为请求者”与“行为实现者”是紧耦合的.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这些情况下,将“行为请求者”与“行为实 ...
- 大话设计模式--工厂模式 factory -- C++实现实例
实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...
随机推荐
- Linux系统字符集乱码问题
假设你在安装Linux的过程中就选择了中文.可能能够省去步骤1.2.反之.假设你先安装了英文环境,而后希望它支持中文,则能够1.2步 1.首先在linux中安装中文包安装中文简体包rpm -ivh k ...
- Linux 查看tomcat占用的端口号
第一步:先查看tomcat占用的进程号 ps -ef|grep tomcat 第二步:根据进程号,查看进程所占用的端口 netstat -apn 由此得知,tomcat的进程号是21845,并得到端口 ...
- css3 jQuery实现3d搜索框+为空推断
<!DOCTYPE html> <html> <head> <title>css3实现3d搜索框</title> <style> ...
- 【深入JVM】JVM工具之JMAP
一.工具介绍 假设把java\bin文件夹配置到环境变量.在cmd输入jmap会有例如以下提示: 翻译:打印出某个java进程(使用pid)内存内的,全部'对象'的情况(如:产生那些对象,及其数量). ...
- linux 中vim学习与总结
平常使用vim总是忘记快捷键,在这里做一个总结一下比较常用的快捷把,省的每次都要去查. h : 向左移动一个字符(←) j : 向上移动一个字符(↑) k : (↓) l : (→) ctrl+f : ...
- 【ubantu】Ubuntu的一些常用命令
创建文件: touch a.txt 创建文件夹: mkdir NewFolder 删除文件: rm a.txt 删除文件夹: rmdir NewFolder 删除带有文件的文件夹: rm -rf Ne ...
- Java线程—-Runnable和Callable的区别和联系
Java 提供了三种创建线程的方法 1.继承Thread接口 public class Thread2Thread { public static void main(String[] args) { ...
- 精通 Android Data Binding
转自:https://github.com/LyndonChin/MasteringAndroidDataBinding 官方虽然已经给出了教程 - Data Binding Guide (中文版 - ...
- Android源码下载之----内核需要另外下载
用repo sync下载的android源码默认不包含kernel目录,需要自己另外下载. 下载命令:$ git clone https://android.googlesource.com/kern ...
- [转]springmvc常用注解标签详解
1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...