天天看点

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

一、命令模式的概念

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

二、命令模式使用场景

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();
}      

运行结果:

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

五、命令模式的优缺点