C++设计模式——命令模式

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

 

 代码:

#include <iostream>
using namespace std;

//Receiver类 知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者
class Receiver {
public:
    void action() {
        cout << "请求执行!" << endl;
    }
};


//Command类,用来声明执行操作的接口
class Command 
{
protected:
    Receiver* receiver;
public:
    Command(Receiver* receiver):receiver(receiver){}
    virtual ~Command() {};
    virtual void Execute() = 0;//抽象执行命令接口
};

//ConcreteCommand类 将一个接收者对象绑定于一个动作 调用接收者相应的操作 以实现Execute
class ConcreteCommand :public Command {
public:    
    ConcreteCommand(Receiver* receiver):Command(receiver) {

    }
    virtual void Execute() {
        receiver->action();
    }
};


//Invoker类,要求该命令执行这个请求
class Invoker {
private:
    Command* command;
public:
    void SetCommand(Command* command) {
        this->command = command;
    }
    void ExecuteCommand() {
        return command->Execute();
    }
};



int main()
{
    Receiver* r = new Receiver();
    Command* c = new ConcreteCommand(r);
    Invoker* i = new Invoker();
    i->SetCommand(c);
    i->ExecuteCommand();
    delete i;
    i = nullptr;
    delete c;
    c = nullptr;
    delete r;
    r = nullptr;
    system("pause");
    return 0;
}

优点

命令模式的优点

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

缺点

模式的缺点

如果命令很多,Command类会很多,增加系统复杂性。

posted @ 2022-02-21 10:26  冰糖葫芦很乖  阅读(281)  评论(0编辑  收藏  举报