命令模式

命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

命令模式的好处:
1、它能较容易地设计一个命令队列;
2、在需要的情况下,可以较容易地将命令记入日志;
3、允许接收请求的一方决定是否要否决请求;
4、可以容易地实现对请求的撤销和重做;
5、由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易;
6、命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。

在这里插入图片描述
Invoker.h

#ifndef INVOKER_H
#define INVOKER_H

#include "Command.h"
#include <list>

using namespace std;

class Invoker {
private:
    list<Command *> commands;
public:
    void setCommand(Command *c) {
        commands.push_back(c);
    }

    void Notify() {
        for (auto c = commands.begin(); c != commands.end(); c++) {
            (*c)->Excute();
        }
    }
};

#endif //INVOKER_H

Command.h

#ifndef COMMAND_H
#define COMMAND_H

#include "Reciever.h"

class Command {
public:
    virtual void Excute() = 0;
    virtual void setReceiver(Receiver* r) = 0;
    virtual ~Command(){};
};

class ConcreteCommand : public Command {
private:
    Receiver* receiver;
public:
    void setReceiver(Receiver* r) {
        receiver = r;
    }
    void Excute() {
        receiver->Action();
    }
};

#endif //COMMAND_H

Receiver.h

#ifndef RECIEVER_H
#define RECIEVER_H

#include <iostream>

class Receiver {
public:
    void Action() {
        std::cout << "Receiver" << std::endl;
    }
};

#endif //RECIEVER_H

main.cpp

#include <iostream>
#include "Command.h"
#include "Invoker.h"

using namespace std;

int main() {
    Command* c = new ConcreteCommand();
    Receiver* r = new Receiver();
    c->setReceiver(r);

    Invoker i;
    i.setCommand(c);
    i.Notify();   // Receiver
    return 0;
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
命令模式是一种行为设计模式,它允许您将操作封装在对象中,并通过在对象之间传递这些对象来解耦发送者和接收者。以下是一个简单的命令模式案例: 假设我们有一个遥控器,它可以控制一个灯。我们可以使用命令模式来实现遥控器的行为。首先,我们定义一个命令接口,例如: ``` public interface Command { public void execute(); } ``` 然后,我们实现一个具体的命令类,例如打开灯的命令: ``` public class TurnOnLightCommand implements Command { private Light light; public TurnOnLightCommand(Light light) { this.light = light; } public void execute() { light.turnOn(); } } ``` 这里的 `Light` 是一个接收者对象,它有一个 `turnOn()` 方法用于打开灯。然后,我们可以定义一个遥控器类,它有两个按钮,一个用于打开灯,另一个用于关闭灯: ``` public class RemoteControl { private Command turnOnCommand; private Command turnOffCommand; public RemoteControl(Command turnOnCommand, Command turnOffCommand) { this.turnOnCommand = turnOnCommand; this.turnOffCommand = turnOffCommand; } public void pressTurnOnButton() { turnOnCommand.execute(); } public void pressTurnOffButton() { turnOffCommand.execute(); } } ``` 最后,我们可以使用以下代码来测试我们的命令模式实现: ``` Light light = new Light(); Command turnOnCommand = new TurnOnLightCommand(light); Command turnOffCommand = new TurnOffLightCommand(light); RemoteControl remoteControl = new RemoteControl(turnOnCommand, turnOffCommand); remoteControl.pressTurnOnButton(); // 打开灯 remoteControl.pressTurnOffButton(); // 关闭灯 ``` 这就是一个简单的命令模式案例,它允许我们将操作封装在对象中并解耦发送者和接收者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值