command 模式示例

// receiver
class  Tape_Recorder
{
public:
    void  Play()
    {
        printf("since my baby left me: \n");
    }

    void  Stop()
    {
        printf("ok. taking a break.\n");
    }

    void  Rewind()
    {
        printf("zzzikw.\n");
    }

    void  Record(const std::string& sound)
    {
        printf("Record: {%s}\n", sound.c_str());
    }
};

//  command interface
class  Command_Base
{
public:
    virtual  ~Command_Base() {}

    virtual  bool  Enabled() const = 0;
    virtual  void  Execute() = 0;
};

// concrete command
class  PlayCommand : public Command_Base
{
public:
    PlayCommand(Tape_Recorder* pRecorder)
        : m_pRecorder(pRecorder)
    {
    }

    virtual  bool  Enabled() const
    {
        return true;
    }

    virtual  void  Execute()
    {
        m_pRecorder->Play();
    }

private:
    Tape_Recorder*   m_pRecorder;
};

// stop

class  StopCommand : public  Command_Base
{
public:
    StopCommand(Tape_Recorder* pRecorder)
        : m_pRecorder(pRecorder)
    {

    }

    virtual  bool  Enabled() const
    {
        return true;
    }

    virtual  void  Execute()
    {
        m_pRecorder->Stop();
    }

private:
    Tape_Recorder*  m_pRecorder;
};

class Invoker
{
public:
    ~Invoker()
    {
        for (auto& command : m_command) {
            delete command;
            command = NULL;
        }
        m_command.clear();
    }

    void  AddCommand(Command_Base*pCommand)
    {
        m_command.push_back(pCommand);
    }

    void   Request()
    {
        for (auto command : m_command) {
            command->Execute();
        }
    }

private:
    typedef   std::vector  Commands;
    Commands  m_command;
};

void  TestCommandPattern()
{
    Tape_Recorder  recorder;
    Invoker        invoker;
    Command_Base* pcommand = new  PlayCommand(&recorder);
    invoker.AddCommand(pcommand);
    pcommand = new StopCommand(&recorder);
    invoker.AddCommand(pcommand);

    invoker.Request();

 //   printf("\n");
 //   printf("\n");
 //   printf("\n");
    printf("***************************\n");
}

你可能感兴趣的:(C++)