设计模式之命令模式-要听话!
Published on 2022-08-03 14:33 in 分类: C/C++ with 萧海~
分类: C/C++

设计模式之命令模式-要听话!

    一、命令模式的概念

    命令模式是一种数据驱动的设计模式,属于行为型模式;请求以命令的形式包裹在对象中,并传递给调用对象;调用对象寻找可以处理该命令的合适对象,并把该命令传给相应的对象,该对象执行命令。

    二、命令模式使用场景

    1、命令模式是将一个请求封装为一个对象,从而可用不同的请求对客户端进行参数化、对请
    求排队或记录请求日志、支持可撤销的操作等等。

    三、命令模式构建方法

    1、命令抽象类(Command)
    命令抽象父类给具体实现类提供统一的共同接口和方法。

    2、命令具体实现类(ConcreteCommand)
    命令具体实现类继承抽象父类,用于实现抽象父类中的共同接口和方法。

    3、接收者类(Receiver)
    需要被调用的目标对象类

    4、命令对象入口类或者调用者类(Invorker)
    通过命令对象入口类来执行命令对象

    四、命令模式的示例

    // CommandPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    #include <iostream>
    #include <string>
    using namespace std;
    #define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}
    namespace TYPES
    {
    enum COMMANDTYPE
    {
    EXPRESS, // 取快递
    WASH, // 洗碗
    COOK // 做饭
    };
    }
    // 丈夫是接收者-TOBY
    class Husband
    {
    public:
    void setCommand(TYPES::COMMANDTYPE commandType) // 丈夫的话形同“虚”设,还要看媳妇脸色
    {
    switch (commandType)
    {
    case TYPES::EXPRESS:
    cout << "Toby去取快递。。。" << endl;
    break;
    case TYPES::WASH:
    cout << "Toby去洗碗。。。" << endl;
    break;
    case TYPES::COOK:
    cout << "Toby去做饭。。。" << endl;
    break;
    default:
    cout << "任性一回,不想做。" << endl;
    break;
    }
    }
    };
    // 命令抽象类
    class Command
    {
    public:
    virtual void executeCommand() = 0;
    private:
    };
    // 命令具体类-取快递
    class ExpressCommand : public Command
    {
    public:
    ExpressCommand(Husband *pHusband)
    {
    m_pHusband = pHusband;
    }
    virtual void executeCommand()
    {
    m_pHusband->setCommand(TYPES::COMMANDTYPE::EXPRESS);
    }
    private:
    Husband *m_pHusband;
    };
    // 命令具体类-洗碗
    class WashCommand : public Command
    {
    public:
    WashCommand(Husband *pHusband)
    {
    m_pHusband = pHusband;
    }
    virtual void executeCommand()
    {
    m_pHusband->setCommand(TYPES::COMMANDTYPE::WASH);
    }
    private:
    Husband *m_pHusband;
    };
    // 命令具体类-做饭
    class CookCommand : public Command
    {
    public:
    CookCommand(Husband *pHusband)
    {
    m_pHusband = pHusband;
    }
    virtual void executeCommand()
    {
    m_pHusband->setCommand(TYPES::COMMANDTYPE::COOK);
    }
    private:
    Husband *m_pHusband;
    };
    // 媳妇是命令发送者
    class Wife
    {
    public:
    void setCommand(Command *pCommand)
    {
    m_pCommand = pCommand;
    if (pCommand != nullptr)
    {
    m_pCommand->executeCommand();
    }
    return;
    }
    private:
    Command *m_pCommand;
    };
    int main()
    {
    cout << "----------命令行模式----------" << endl;
    Husband *pHusband = new Husband;
    ExpressCommand *pExpressCommand = new ExpressCommand(pHusband);
    WashCommand *pWashCommand = new WashCommand(pHusband);
    CookCommand *pCookCommand = new CookCommand(pHusband);
    Wife *pWife = new Wife;
    pWife->setCommand(pExpressCommand);
    pWife->setCommand(pWashCommand);
    pWife->setCommand(pCookCommand);
    DELETE_PTR(pWife);
    DELETE_PTR(pExpressCommand);
    DELETE_PTR(pWashCommand);
    DELETE_PTR(pCookCommand);
    DELETE_PTR(pHusband);
    std::cout << "Hello World!\n";
    getchar();
    }

    运行结果:
    在这里插入图片描述

    五、命令模式的优缺点

    优点:
    1、命令模式降低了系统耦合度。
    2、可以很容易把新命令添加到系统中。

    缺点:
    1、使用命令模式可能会导致系统中出现很多的具体命令类。

    原文:https://blog.csdn.net/toby54king/article/details/104504777

    posted @   萧海~  阅读(93)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
    · C#/.NET/.NET Core优秀项目和框架2025年2月简报
    · 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
    · 什么是nginx的强缓存和协商缓存
    · 一文读懂知识蒸馏
    点击右上角即可分享
    微信分享提示
    电磁波切换