设计模式14、命令模式 Command
解释说明:命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传递给调用对象。调用对象寻找可以处理该命令的合适对象,并把该命令传给相应的对象,该对象执行命令。
命令抽象类(Command):定义命令的接口,声明执行的方法。
具体命令(ConcreteCommand):命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
实现者/接收者(Receiver):接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
调用者/请求者(Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
command.h
#pragma once
class Command
{
public://每个命令类都必须有一个执行命令的方法virtual void execute() = 0;
};
receiver.h
#pragma once
class Receiver
{
public://抽象接收者, 定义每个接收者都必须完成的业务virtual ~Receiver() { }virtual void doSomething() = 0;
};
concreteCommand.h
#pragma once
#include "command.h"
#include "receiver.h"
#include <iostream>
class ConcreteCommand1 :public Command
{
private:Receiver* m_pReceiver;//哪个Receiver类进行命令处理
public://构造函数传递接收者ConcreteCommand1(Receiver* receiver){m_pReceiver = receiver;}//必须实现一个命令void execute(){//业务处理std::cout << "command1 run" << std::endl;m_pReceiver->doSomething();}
};
class ConcreteCommand2 : public Command
{
private:Receiver* m_pReceiver;
public:ConcreteCommand2(Receiver* receiver){m_pReceiver = receiver;}void execute(){std::cout << "command2 run" << std::endl;m_pReceiver->doSomething();}
};
concreteReciver.h
#pragma once
#include "receiver.h"
#include <iostream>
class ConcreteReciver1 : public Receiver
{//每个接收者都必须处理一定的业务逻辑
public:void doSomething(){std::cout << "Reciver1 doing" << std::endl;}
};
class ConcreteReciver2 : public Receiver
{//每个接收者都必须处理一定的业务逻辑
public:void doSomething(){std::cout << "Reciver2 doing" << std::endl;}
};
invoker.h
#pragma once
#include "command.h"
#include <iostream>
class Invoker
{
private:Command* m_pCommand;
public://接受命令void setCommand(Command* command){m_pCommand = command;std::cout << "invoker add command" << std::endl;}//执行命令void action(){m_pCommand->execute();std::cout << "invoker action command" << std::endl;}
};
main.cpp
#include "concreteCommand.h"
#include "concreteReciver.h"
#include "invoker.h"
int main()
{//首先声明调用者InvokerInvoker* invoker = new Invoker();//定义接收者Receiver* receiver = new ConcreteReciver1();Receiver* receiver2 = new ConcreteReciver2();//定义一个发送给接收者的命令Command* command = new ConcreteCommand1(receiver);Command* command2 = new ConcreteCommand2(receiver);Command* command3 = new ConcreteCommand1(receiver2);Command* command4 = new ConcreteCommand2(receiver2);//把命令交给调用者去执行invoker->setCommand(command);invoker->action();invoker->setCommand(command2);invoker->action();invoker->setCommand(command3);invoker->action();invoker->setCommand(command4);invoker->action();system("pause");return 0;
}