文档章节

Command模式

首席吹牛官
 首席吹牛官
发布于 2015/05/22 12:56
字数 594
阅读 6
收藏 0
                    命令(Command)模式属于对象的行为模式【GOF95】。命令模式又称为行动(Action)模式或交易(Transaction)模式。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

  适用性:在软件系统中,行为请求者与行为实现者之间通常呈现一种紧耦合的关系。但在某些场合,比如要对行为进行记录撤销重做事务等处理,这种无法抵御变化的紧耦合是不合适的。这种情况下,使用command模式将行为请求者与行为实现者进行解耦。

 

                    这是我举例子的类图(比较挫...)

                   

 

                       代码实现:

#ifndef OPERATOR_H

#define OPERATOR_H
enum Operator {FORWARD, BACK};
#endif // OPERATOR_H

 

#ifndef COMMAND_H

#define COMMAND_H
#include "Operator.h"
#include <iostream>
class Command
{
public:
    Command(Operator _operator);
    virtual ~Command() {std::cout <<"c~\n";}
    virtual void operation() = 0;
    Operator getOperator() const {return _comOperator;}
private:
    Operator _comOperator;
};
#endif // COMMAND_H

#include "command.h"

Command::Command(Operator _operator):_comOperator(_operator)
{
}

#ifndef FORWARDCOMMAND_H

#define FORWARDCOMMAND_H
#include "command.h"
#include "receiver.h"
class ForwardCommand : public Command
{
public:
    ForwardCommand(Operator _operator, Receiver *_rev);
    ~ForwardCommand(){delete rev;}
    void operation();
private:
    Receiver *rev;
};
#endif // FORWARDCOMMAND_H
 
#include "forwardcommand.h"
ForwardCommand::ForwardCommand(Operator _operator, Receiver *_rev):Command(_operator),rev(_rev)
{
}
void ForwardCommand::operation()
{
    rev->execute();
}
#ifndef BACKCOMMAND_H
#define BACKCOMMAND_H
#include "command.h"
#include "receiver.h"
class BackCommand : public Command
{
public:
    BackCommand(Operator _com, Receiver* _rev);
    ~BackCommand(){delete rev;}
    void operation();
private:
    Receiver *rev;
};
#endif // BACKCOMMAND_H
#include "backcommand.h"
BackCommand::BackCommand(Operator _com, Receiver *_rev):Command(_com),rev(_rev)
{
}
void BackCommand::operation()
{
    rev->execute();
}
#ifndef RECEIVER_H
#define RECEIVER_H
#include <iostream>
class Receiver
{
public:
    Receiver();
    virtual ~Receiver(){std::cout <<"r~\n";}
    virtual void execute() = 0;
};
#endif // RECEIVER_H
#include "receiver.h"
Receiver::Receiver()
{
}
 
#ifndef FORWARDRECEIVER_H
#define FORWARDRECEIVER_H
#include "receiver.h"
class ForwardReceiver : public Receiver
{
public:
    ForwardReceiver();
    ~ForwardReceiver(){}
    void execute();
};
#endif // FORWARDRECEIVER_H
#include "forwardreceiver.h"
ForwardReceiver::ForwardReceiver()
{
}
void ForwardReceiver::execute()
{
     std::cout <<"ForwardCommand\n";
}
#ifndef BACKRECEIVER_H
#define BACKRECEIVER_H
#include "receiver.h"
class BackReceiver : public Receiver
{
public:
    BackReceiver();
    ~BackReceiver(){}
    void execute();
};
#endif // BACKRECEIVER_H
#include "backreceiver.h"
BackReceiver::BackReceiver()
{
}
void BackReceiver::execute()
{
    std::cout <<"backCommand\n";
}
#ifndef INVOKER_H
#define INVOKER_H
#include "Operator.h"
#include <vector>
#include "command.h"
class Invoker
{
public:
    Invoker();
    ~Invoker();
    void invoke(Operator _com);
    void addCommand(Command *_com);
private:
    std::vector<Command*> CommandList;
};
#endif // INVOKER_H
#include "invoker.h"
Invoker::Invoker()
{
}
Invoker::~Invoker()
{
    std::vector<Command*>::iterator ite;
    for (ite = CommandList.begin();ite != CommandList.end();++ite) {
        delete (*ite);
    }
    CommandList.clear();
}
void Invoker::addCommand(Command *_com)
{
    //这里可以做一些判断防止相同的对象生成
    CommandList.push_back(_com);
}
void Invoker::invoke(Operator _com)
{
    std::vector<Command*>::iterator ite;
    for (ite = CommandList.begin();ite != CommandList.end();++ite) {
        if ((*ite)->getOperator()== _com) {
            (*ite)->operation();
        }
    }
}
#include <iostream>
using namespace std;
#include "invoker.h"
#include "backcommand.h"
#include "backreceiver.h"
#include "forwardcommand.h"
#include "forwardreceiver.h"
int main()
{
    Invoker in;
    in.addCommand(new ForwardCommand(FORWARD,new ForwardReceiver));//不建议这样写,容易造成内存泄漏
    in.addCommand(new BackCommand(BACK,new BackReceiver));
    in.invoke(FORWARD);
    return 0;
}

 

© 著作权归作者所有

首席吹牛官
粉丝 9
博文 368
码字总数 191938
作品 0
闵行
程序员
私信 提问
shell语句:Shell case esac语句

  case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。 case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:case 值 in 模式...

C语言学习
2017/04/01
0
0
常用 shell 命令

case case 值 in 模式1) 模式2) *) esac if fi command ; then elif command ; thenelse commandfi

Tmac
2016/06/29
27
0
行为型模式之七:命令模式

命令设计模式是选中一个操作与操作的参数,并将它们封装成对象去执行,记录等等,在下面的例子中,Command是操作,他的参数是Computer,他们被包裹在Switch中。 从另一个角度来说,命令模式包...

刀狂剑痴
2015/08/27
29
0
设计模式--命令模式

命令模式(command): 示例: 命令模式测试类CommandTest.java 命令接口类Command.java 命令实现类CommandImpl.java 命令调用类Invoker.java 命令接收类Receiver.java...

有钱有爱
2016/04/08
25
0
Java设计模式之-命令模式(Command)

命令模式将着眼点放在了一个命令,或更准确来说,用英文单词Command来表示,它是一发命令,一条指令,一次操作,一个动作。命令模式就是希望将Command的具体方法,封装在一个具体类中,然后通...

Mock2052
2017/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
51分钟前
3
0
Kafka 2.3 Producer (0.9以后版本适用)

kafka0.9版本以后用java重新编写了producer,废除了原来scala编写的版本。 这里直接使用最新2.3版本,0.9以后的版本都适用。 注意引用的包为:org.apache.kafka.clients.producer import ja...

实时计算
59分钟前
3
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
14
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部