`

[行为模式] head first 设计模式之命令模式(Command)

 
阅读更多
1 意图
  将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
  命令模式可以将"动作的请求者"从"动作的执行者"对象中解耦。

2 别名
  动作(Action) 事物(Transaction)



以前做过一个项目,类似控制台的命令,把复杂的请求和相应利用Command模式进行封装;
//////////////////////////////////////////////////////////////////////////
#include "Reciever.h"
class Reciever;

class Command
{
public:
    virtual ~Command(){}
	virtual void Excute() = 0;

protected:
    Command(){}
};

class ConcreteCommand : public Command
{
public:
    ConcreteCommand(Reciever *rev){this->_rev = rev;}
    ~ConcreteCommand(){}

    void Excute(){this->_rev->Action();}

private:
	Reciever *_rev;
};

//////////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;

class Reciever
{
public:
    Reciever(){}
    ~Reciever(){}
	void Action()
    {
        cout << "Reciever action..."<<endl;
    }
};

//////////////////////////////////////////////////////////////////////////
#include "Command.h"
class Command;

class Invoker
{
public:
    Invoker(Command *cmd){this->_cmd = cmd;}
    ~Invoker(){}

    void Invoke(){this->_cmd->Excute();}

private:
	Command *_cmd;
};

int main(int argc, char *argv[])
{
	Reciever *rev = new Reciever();
	Command *cmd = new ConcreteCommand(rev);
	Invoker *inv = new Invoker(cmd);
	inv->Invoke();

	return 0;
}


在headfirst中采用的是遥控器的例子,具体如下:
#include <iostream>
#include <cassert>
#include <string>
using namespace std;

//命令模式
namespace Command
{

//////////////////////////////////////////////////////////////////////////
const int REMOTE_SIZE = 7;

//////////////////////////////////////////////////////////////////////////
class Light
{
public:
    Light(){}
    Light(string str){ m_Name = str;}

    void on(){ cout << m_Name.c_str() << " Light is on" << endl;}
    void off(){ cout << m_Name.c_str() << " Light is off" << endl;}

private:
    string m_Name;
};

//////////////////////////////////////////////////////////////////////////
class Command
{
public:
    virtual ~Command(){}
    virtual void execute() = 0;
    virtual char* getName() = 0;
};

//////////////////////////////////////////////////////////////////////////
class LightOnCommand : public Command
{
public:
    LightOnCommand(Light* light)
        :m_Light(NULL)
    {
        this->m_Light = light;
    }
    ~LightOnCommand()
    {
        //if (m_Light != NULL)
        //{
        //    delete m_Light;
        //}
    }

    virtual void execute()
    {
       assert(m_Light != NULL);
       m_Light->on();
    }

    virtual char* getName()
    {
        return "LightOnCommand";
    }

private:
    Light* m_Light;
};

//////////////////////////////////////////////////////////////////////////
class LightOffCommand : public Command
{
public:
    LightOffCommand(Light* light)
        :m_Light(NULL)
    {
        this->m_Light = light;
    }
    ~LightOffCommand()
    {
        if (m_Light != NULL)
        {
            delete m_Light;
        }
    }

    virtual void execute()
    {
        assert(m_Light != NULL);
        m_Light->off();
    }

    virtual char* getName()
    {
        return "LightOffCommand";
    }

private:
    Light* m_Light;
};

//////////////////////////////////////////////////////////////////////////
class Stereo
{
public:
    void on(){ cout << "Stereo::on" << endl;}
    void setCD(){ cout << "Stereo::setCD" << endl;}
    void setVolume(int vol)
    {
        cout << "Stereo::setVolume(" << vol << ")"<< endl;
    }
};

//////////////////////////////////////////////////////////////////////////
class StereoOnWithCDCommand : public Command
{
public:
    StereoOnWithCDCommand(Stereo* stereo)
        :m_Stereo(NULL)
    {
        m_Stereo = stereo;
    }
    virtual ~StereoOnWithCDCommand()
    {
        //if (m_Stereo != NULL)
        //{
        //    delete m_Stereo;
        //}
    }
    virtual void execute()
    {
        assert(m_Stereo != NULL);
        m_Stereo->on();
        m_Stereo->setCD();
        m_Stereo->setVolume(11);
    }

    virtual char* getName()
    {
        return "LightOffCommand";
    }

private:
    Stereo* m_Stereo;
};

//////////////////////////////////////////////////////////////////////////
class SimpleRemoteControl
{
public:
    SimpleRemoteControl()
        :m_Slot(NULL)
    {}
    ~SimpleRemoteControl()
    {
        //if (m_Slot != NULL)
        //{
        //    delete m_Slot;
        //}
    }
    void setCommand(Command* command)
    {
        //if (m_Slot != NULL)
        //{
        //    delete m_Slot;
        //}

        m_Slot = command;
    }
    void buttonWasPressed()
    {
        assert(m_Slot != NULL);
        m_Slot->execute();
    }

private:
    Command* m_Slot;
};

//////////////////////////////////////////////////////////////////////////
class RemoteControlTest
{
public:
    void run()
    {
        //test for simple remote control
        SimpleRemoteControl* remote = new SimpleRemoteControl();

        Light* light = new Light();
        LightOnCommand* lightOn = new LightOnCommand(light);
        remote->setCommand(lightOn);
        remote->buttonWasPressed();
        delete light;
        delete lightOn;

        Stereo* stereo = new Stereo();
        StereoOnWithCDCommand* stereoOnWithCDCommand = new StereoOnWithCDCommand(stereo);
        remote->setCommand(stereoOnWithCDCommand);
        remote->buttonWasPressed();
        delete stereo;
        delete stereoOnWithCDCommand;

        delete remote;
    }
};

}//namespace Command
分享到:
评论

相关推荐

    Head First 设计模式 (六) 命令模式(Command pattern) C++实现

    在Head First 设计模式这本书中,第六章详细介绍了如何在C++中实现命令模式。 命令模式的核心思想是将"做什么"与"谁去做"分离开来。命令对象持有接收者并调用其特定方法,而调用者只关心命令对象,而不关心具体的...

    Headfirst设计模式中文高清PDF+附书源码

    《Headfirst设计模式》是一本深受开发者欢迎的设计模式学习书籍,尤其对于初学者而言,其独特的教学方式使得复杂的概念变得易于理解。这本书以其高清的中文版PDF格式提供,结合书中源码,为读者提供了深入实践的可能...

    Head First设计模式和HeadFirst in java 源码以及23种设计模式关系图

    总的来说,这个压缩包包含的资源可以帮助你深入理解设计模式,通过《HeadFirst设计模式》和《HeadFirst in Java》的源码,你可以学习到如何在实际项目中应用这些模式。而UML类图则提供了直观的视角,便于你把握设计...

    HeadFirst设计模式英文版

    《Head First 设计模式》的英文版是一本面向初学者的设计模式入门书籍,它以幽默风趣的文风,深入浅出地介绍了软件设计中经常使用的设计模式。设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的...

    Head.First设计模式_PDF

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Template Method、iterator、Composite、State、proxy。最后三章比较...

    head first 设计模式 PDF电子书下载

    行为型模式则关注于对象间的交互和责任分配,例如策略模式(Strategy)、观察者模式(Observer)和命令模式(Command)。 在《Head First 设计模式》中,作者通过幽默风趣的插图和生动的例子,使得原本可能枯燥的...

    headfirst设计模式

    《Head First设计模式》是一本深受开发者欢迎的设计模式教程,以其独特的视觉呈现方式和易于理解的语言,让初学者也能快速掌握设计模式的核心概念。这本书深入浅出地介绍了23种GOF(GoF,Gamma、Erich、Johnson、...

    HeadFirst设计模式JAVA版源码

    《HeadFirst设计模式JAVA版源码》是一份深入学习设计模式的重要资源,它基于流行的编程语言Java,旨在帮助开发者理解并应用设计模式于实际项目中。设计模式是软件工程中的重要概念,它代表了在特定场景下解决问题的...

    Head First设计模式 源代码

    《Head First设计模式》是软件开发领域的一本经典著作,主要介绍了面向对象设计中的各种模式。这本书通过生动、直观的方式,使读者能够更好地理解和应用设计模式。源代码是书中理论知识的具体实现,可以帮助读者深入...

    Head First设计模式官方原码

    《Head First设计模式》是一本深受开发者欢迎的设计模式学习书籍,以其独特的教学方式,通过丰富的图解和幽默的语言,帮助读者深入理解设计模式的核心概念。这本书的官方源码提供了书中所讲解的每个设计模式的实际...

    [中文]Head-First设计模式

    《Head-First设计模式》是设计模式领域内一本广受欢迎的入门书籍,以其独特的视觉呈现方式和易懂的讲解风格,让初学者也能快速理解并掌握设计模式的精髓。设计模式是软件工程中的一种最佳实践,是解决常见编程问题的...

    Head First设计模式(含目录)

    《Head First设计模式》是一本深受程序员喜爱的书籍,它以独特的方式讲解了设计模式这一核心的编程概念。设计模式是软件开发中的经验总结,是解决常见问题的有效模板,可以帮助开发者编写可维护、可扩展、易理解的...

    Head First 设计模式 扫描版

    行为型模式则关注对象间的责任分配和交互,例如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录...

    head first 设计模式

    《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...

    Head First 设计模式(中文版.pdf

    行为型模式则关注对象之间的交互和职责分配,如观察者模式(Observer)、模板方法模式(Template Method)、命令模式(Command)、迭代器模式(Iterator)、策略模式(Strategy)、状态模式(State)、访问者模式...

    head first设计模式学习代码

    《Head First设计模式学习代码详解》 设计模式是软件工程中的宝贵经验总结,它提供了一套通用的解决方案模板,帮助开发者在面对复杂问题时能够快速有效地进行设计和开发。Head First设计模式是一本非常受欢迎的设计...

    head first 设计模式 中文版带书签

    根据提供的文件信息,“Head First设计模式中文版带书签”主要涉及的是软件工程中的设计模式这一核心主题。设计模式是在软件开发过程中针对特定问题而形成的最佳实践或解决方案模板,能够帮助开发者解决常见的设计...

Global site tag (gtag.js) - Google Analytics