设计模式——命令模式

《HeadFirst 设计模式》读书笔记

 

引言

通过封装方法调用,将运算块包装成形。在调用此运算的对象不需要关系事情是如何进行的,只要知道如何使用包装成形的方法完成它就可以。

命令模式将“动作的请求者”从“动作的执行者”对象中解耦,将“发出请求的对象”和“接受与执行这些请求的对象”分隔开来。

 

定义

命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

命令对象将动作和接收者包进对象者,这个对象只暴露出一个execute()方法,此方法被调用的时候,接收者就会进行这些动作。从外面来看,其他对象不知道究竟哪个接收者进行了哪些动作,只知道如果调用execute(),请求的目的就能达到。

 

类图

设计模式——命令模式_第1张图片

Commend为所有命令声明了一个接口。调用命令对象的execute()方法,就可以让接收者进行相关的工作。

ConcreteCommend定义了动作和接收者之间的绑定关系。调用者只要调用execute(),就可以发出请求,然后由ConcreteCommend调用接收者的一个或多个动作。

Receiver知道如何进行必要的工作,实现这个请求。任何类都可以当接收者。

Invoker 调用者持有一个命令对象,并某个时间点调用命令对象的exectue()方法,将请求实现。

Client负责创建ConcreteCommend,并设置其接收者。

 

实例:开关灯遥控器

 

设计模式——命令模式_第2张图片

class Light
{
public:
    Light(){}

    void on()
    {
        std::cout << "Light on" << std::endl;
    }
    void off()
    {
        std::cout << "Light off" << std::endl;
    }
};

class Command
{
public:
    Command();

    virtual void execute() = 0;
};


class LightOnCommand : public Command
{
public:
    LightOnCommand(Light l);
    void execute();

private:
    Light light;
};

LightOnCommand::LightOnCommand(Light l) :
    light{l}
{

}

void LightOnCommand::execute()
{
    light.on();
}


class SimpleRemoteControl
{
public:
    SimpleRemoteControl();
    void setCommand(Command *oncommand);
    void onbuttonWasPressed();

private:
    Command *onslot;
};

SimpleRemoteControl::SimpleRemoteControl()
{

}

void SimpleRemoteControl::setCommand(Command *oncommand, Command *offcommand)
{
    onslot = oncommand;
}

void SimpleRemoteControl::onbuttonWasPressed()
{
    onslot->execute();
}

//测试
int main()
{
	//遥控器就是调用者
	SimpleRemoteControl remote;
	//电灯是请求的接收者
	Light light;
	//创建命令,将接收者传给它
	LightOnCommand lightOn(light);

	//把命令传给调用者
	remote.setCommand(&lightOn);
	remote.buttonWasPressed();

	return 0;
}

 

你可能感兴趣的:(设计模式,C++)