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++实现实例的更多相关文章

  1. linkin大话设计模式--命令模式

    linkin大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...

  2. 设计模式 - 命令模式(command pattern) 多命令 具体解释

    命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...

  3. 设计模式 - 命令模式(command pattern) 具体解释

    命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...

  4. 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释

    命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...

  5. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  6. 设计模式-命令模式(Command)

    关注公众号 JavaStorm 获取更多成长. 大约需要6分钟读完.建议收藏后阅读. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日 ...

  7. 设计模式--命令模式Command(对象行为型)

    一.命令模式 将一个请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. (1)Command类:是一个抽象类,类中对需要执行的命令进行 ...

  8. C#设计模式——命令模式(Command Pattern)

    一.概述通常来说,“行为请求者”与“行为实现者”是紧耦合的.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这些情况下,将“行为请求者”与“行为实 ...

  9. 大话设计模式--工厂模式 factory -- C++实现实例

    实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...

随机推荐

  1. vim-colors-config

    在vim中,主题是以插件形式存在.其中系统自带的主题,存放在$VIMRUNTIME/colors文件夹下,以*.vim命名.(注:查看$VIMRUNTIME请在vim中执行 :echo $VIMRUN ...

  2. k8s集群日志

    硬件环境: 三台虚拟机, 10.10.20.203 部署docker.etcd.flannel.kube-apiserver.kube-controller-manager.kube-schedule ...

  3. ubuntu 16.04查询文件安装目录

    dpkg -L filename dpkg -l | grep filename whereis filename find / -name filename

  4. GitHub 寻宝指南

    GitHub 寻宝指南 寻找 Demo 技术栈的关键字搜索,并按更新时间进行排序 生命有限 ,如若是每次我们尝试一个新的技术,总得自己编写一个个 Demo.编写多个 Demo,都得花去个半天八小时的时 ...

  5. DELL inspiron1420 linux下的wifi驱动安装

    首先确定无线网卡类型: lspci -vnn -d 14e4: 比如我的网卡类型为 04:00.0 Network controller [0280]:Broadcom Corporation BCM ...

  6. JS获取图片的缩略图

    js获取上传文件的缩略图 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  7. iOS和Android后台机制对比

    转自:http://blog.csdn.net/zsch591488385/article/details/27232881 一.iOS的“伪后台”程序 首先,先了解一下ios 中所谓的「后台进程」到 ...

  8. 【python】-- json & pickle、xml、requests、hashlib、shelve、shutil、configparser、subprocess

    json & pickle Python中用于序列化的两个模块 json     用于[字符串]和 [python基本数据类型] 间进行转换 pickle   用于[python特有的类型] ...

  9. MySQL合并多行

    select id,group_concat(re_id order by re_id separator ",") as re_idfrom tablenamegroup by ...

  10. CSS 布局实例系列(三)如何实现一个左右宽度固定,中间自适应的三列布局——也聊聊双飞翼

    今天聊聊一个经典的布局实例: 实现一个三列布局,其中左侧和右侧的部分宽度固定,中间部分宽度随浏览器宽度的变化而自适应变化 可能很多朋友已经笑了,这玩意儿通过双飞翼布局就能轻松实现.不过,还请容我在双飞 ...