设计模式_命令模式
程序员文章站
2022-03-30 23:05:33
...
命令模式:
执行结果:
将一个请求封装为一个对象(即我们创建的Command对象),从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。
解决的问题:
在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
类图:
实例:
请求计算机画出不同的图形.
将计算机当作命令的接收者,将画图形的请求封装成命令.
发出不同的命令即可让计算机画出不同的图形.
完整可执行的代码:
#ifndef _COMMAND_H_
#define _COMMAND_H_
#include<iostream>
using namespace std;
//命令接收者
class Computer
{
public:
void drawCircle()
{
cout << "draw Circle" << endl;
}
void drawRectangle()
{
cout << "draw Rectangle" << endl;
}
};
//抽象的命令类
class XCommand
{
public:
XCommand( Computer* cp ):computer(cp) {}
virtual void execute() = 0;
protected:
Computer * computer;
};
//画圆形的命令
class DrawCircleCommand : public XCommand
{
public:
DrawCircleCommand( Computer* cp ):XCommand(cp) {}
void execute() override
{
computer->drawCircle();
}
};
//画矩形的命令
class DrawRectangleCommand: public XCommand
{
public:
DrawRectangleCommand(Computer* cp ):XCommand(cp) {}
void execute() override
{
computer->drawRectangle();
}
};
#endif
int main()
{
Computer* cp = new Computer();
DrawCircleCommand * circleCMD = new DrawCircleCommand(cp);
circleCMD->execute();
DrawRectangleCommand * rectangleCMD = new DrawRectangleCommand(cp);
rectangleCMD->execute();
return 0;
}
执行结果: