命令模式(大话设计模式)C/C++版本

命令模式

C++

cpp 复制代码
#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;
    return 0;
}

C

c 复制代码
#include <stdio.h>

typedef struct Receiver
{
    void (*action)(struct Receiver *self); // 行动函数
} Receiver;

typedef struct Command
{
    void (*execute)(struct Command *self); // 执行函数
    Receiver *receiver;                    // 接收者
} Command;

typedef struct Invoker
{
    Command *command; // 命令
} Invoker;

void receiver_action(Receiver *self)
{
    printf("请求执行!\n");
}

typedef struct ConcreteCommand
{
    Command base; // 基础命令
} ConcreteCommand;

void concrete_command_execute(Command *self)
{
    self->receiver->action(self->receiver);
}

int main()
{
    // 初始化 Receiver
    Receiver receiver = {.action = receiver_action};

    // 初始化 ConcreteCommand
    Command concrete_command_base = {.execute = concrete_command_execute, .receiver = &receiver};
    ConcreteCommand concrete_command = {.base = concrete_command_base};

    // 初始化 Invoker
    Invoker invoker = {.command = (Command *)&concrete_command};

    // 执行命令
    invoker.command->execute(invoker.command);

    return 0;
}
相关推荐
崎岖Qiu6 小时前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式
ACP广源盛139246256737 小时前
(ACP广源盛)GSV6172---MIPI/LVDS 信号转换为 Type-C/DisplayPort 1.4/HDMI 2.0 并集成嵌入式 MCU
c语言·开发语言·单片机·嵌入式硬件·音视频
im_AMBER8 小时前
算法笔记 09
c语言·数据结构·c++·笔记·学习·算法·排序算法
是苏浙11 小时前
零基础入门C语言之C语言内存函数
c语言·开发语言
安冬的码畜日常11 小时前
【JUnit实战3_27】第十六章:用 JUnit 测试 Spring 应用:通过实战案例深入理解 IoC 原理
spring·观察者模式·设计模式·单元测试·ioc·依赖注入·junit5
她说彩礼65万13 小时前
C#设计模式 单例模式实现方式
单例模式·设计模式·c#
闭着眼睛学算法13 小时前
【双机位A卷】华为OD笔试之【排序】双机位A-银行插队【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·javascript·c++·python·算法·华为od
AI柠檬15 小时前
C语言基于MPI并行计算矩阵的乘法
c语言·c++·算法
czy878747516 小时前
C语言实现观察者模式
c语言·观察者模式
安冬的码畜日常17 小时前
【JUnit实战3_28】第十七章:用 JUnit 5 实测 SpringBoot 项目
spring boot·功能测试·测试工具·设计模式·单元测试·junit5