设计模式-命令模式

▼魔方 西西 提交于 2020-03-05 23:40:29

命令模式结构图

意图:将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。 

其中:

  • Command声明执行操作的接口。
  • ConcreteCommand将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现Execute。
  • Client创建一个具体命令对象并设定它的接收者。
  • Invoker要求该命令执行这个请求。
  • Receiver知道如何实施与执行一个请求相关的操作。任何类都可以作为一个接收者。 

应用举例 

 假如,程序员负责改bug和写代码,主管负责命令程序员执行操作。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

//程序员,负责改bug,写程序
class Programmer
{
public:
	//改bug
	void ChangeBug() { cout << "ChangeBug" << endl; }
	
	//写程序
	void WriteCode() { cout << "WriteCode" << endl; }
};

//抽象命令类
class Command
{
public:
	Command(Programmer *p) { m_programmer = p; }

	//执行命令
	virtual void Execute() = 0;
protected:
	Programmer *m_programmer;
};

//改bug命令
class BugCommand : public Command
{
public:
	BugCommand(Programmer *p) : Command(p) {}

	//执行改bug命令
	virtual void Execute()
	{
		m_programmer->ChangeBug();
	}
};

//写代码命令
class CodeCommand : public Command
{
public:
	CodeCommand(Programmer *p) : Command(p) {}

	//执行改bug命令
	virtual void Execute()
	{
		m_programmer->WriteCode();
	}
};

//主管
class Manager
{
public:
	Manager(Command *command) { m_command = command; }

	//通知
	void Notify()
	{
		m_command->Execute();
	}

protected:
	Command *m_command;
};

int main()
{
	Programmer *programmer = new Programmer;
	Command *command = new BugCommand(programmer);
	Manager *manager = new Manager(command);
	manager->Notify();

	getchar();
	return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!