• 大话设计模式--命令模式 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
    ");
    }

    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();
    }
    







     

  • 相关阅读:
    推荐系统的常用算法原理和实现
    Maven入门教程
    JAVA设计模式(三)建造者模式
    Java并发编程核心方法与框架-Future和Callable的使用
    Java并发编程核心方法与框架-TheadPoolExecutor的使用
    Java并发编程核心方法与框架-Executors的使用
    Java并发编程核心方法与框架-phaser的使用
    Java并发编程核心方法与框架-CyclicBarrier的使用
    Java并发编程核心方法与框架-CountDownLatch的使用
    Java并发编程核心方法与框架-exchanger的使用
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648180.html
Copyright © 2020-2023  润新知