潍坊市建设厅网站,wordpress post slug,企业商务网站建设论文,广西柳州网站建设价格承接Qt/C软件开发项目#xff0c;高质量交付#xff0c;灵活沟通#xff0c;长期维护支持。需求所寻#xff0c;技术正适#xff0c;共创完美#xff0c;欢迎私信联系#xff01; 一、命令模式的说明 命令模式#xff08;Command Pattern#xff09;是一种行为设计模式… 承接Qt/C软件开发项目高质量交付灵活沟通长期维护支持。需求所寻技术正适共创完美欢迎私信联系 一、命令模式的说明 命令模式Command Pattern是一种行为设计模式它允许将请求封装成对象从而使得可以将请求参数化、队列化、并且可以用不同的请求来参数化客户端调用者的对象。这个模式也支持可撤销的操作。 
命令模式通常包括以下几个角色 Command命令: 定义了执行操作的接口通常包括执行方法execute()和可能的撤销方法undo()。 ConcreteCommand具体命令: 实现了Command接口持有执行操作所需的相关信息包括对接收者对象的引用。 Invoker调用者: 请求的发送者通过命令对象来执行请求。 Receiver接收者: 实际执行操作的对象。 二、命令模式的场景 命令模式在实际应用中有很多常见的案例以下是其中一些常用的情况 菜单和按钮操作在图形用户界面GUI应用程序中菜单项和按钮通常可以被抽象为命令对象。当用户点击菜单项或按钮时相应的命令被执行这样做的好处是可以将用户操作与具体的执行操作解耦。 多级撤销Undo操作命令模式支持撤销操作因此它在需要实现撤销多个步骤的应用程序中很有用。每个命令对象可以保存执行操作的状态以便在撤销时恢复到先前的状态。 任务调度器命令模式可以用于实现任务调度器其中每个任务可以被封装成一个命令对象并且可以按照一定的顺序执行。 日志记录命令模式可以用于实现日志记录系统每个命令对象的执行都可以被记录下来从而实现日志记录功能。 遥控器和家电控制像前面示例中的遥控器一样命令模式常用于实现遥控器和家电的控制系统。每个按钮可以关联一个命令对象当按下按钮时执行相应的命令。 数据库事务处理在数据库操作中命令模式可以用于实现事务处理每个数据库操作可以被封装成一个命令对象事务的提交或回滚可以看作是对一系列命令对象的执行或撤销。 三、命令模式的优缺点 优点 解耦调用者和接收者命令模式通过将请求封装成独立的命令对象从而解耦了请求的发送者和接收者。这使得系统中的对象不需要知道彼此的细节降低了对象之间的耦合度提高了系统的灵活性。 支持撤销和重做由于命令对象通常会保存执行所需的状态信息因此可以很容易地支持撤销和重做操作。这对于实现撤销历史记录、撤销栈等功能非常有用。 支持命令的排队执行命令模式可以将请求排队并按照一定的顺序执行。这对于实现任务调度器等功能很有用。 容易扩展通过添加新的命令类和接收者类可以很容易地扩展命令模式而不需要修改现有的代码。这样使得系统更加灵活和可扩展。 中心化控制命令模式将请求封装成对象使得可以在系统中集中控制命令的执行。这样可以更好地管理和维护系统的行为。 
缺点 类爆炸如果系统中有大量的命令类和接收者类可能会导致类的数量急剧增加从而增加了系统的复杂性。 可能引入过多的代码在某些情况下引入命令模式可能会增加过多的代码量特别是对于简单的功能而言直接调用函数可能更加简单和直接。 增加了系统的复杂性命令模式增加了系统中的额外的抽象层次可能会增加系统的理解和维护成本。 不适用于所有情况命令模式并不适用于所有的情况特别是对于简单的功能而言引入命令模式可能会显得过于复杂。 可能降低执行效率由于命令模式需要将请求封装成对象可能会导致额外的性能开销特别是在系统需要频繁创建和销毁命令对象的情况下。 四、命令模式的代码 
#include iostream
#include string
#include memory// Command Interface
class Command {
public:virtual ~Command() {}virtual void execute()  0;
};// Receiver
class Light {
public:void turnOn() {std::cout  Light is on\n;}void turnOff() {std::cout  Light is off\n;}
};// Concrete Command
class TurnOnCommand : public Command {
public:TurnOnCommand(std::shared_ptrLight light) : m_light(light) {}void execute() override {m_light-turnOn();}
private:std::shared_ptrLight m_light;
};class TurnOffCommand : public Command {
public:TurnOffCommand(std::shared_ptrLight light) : m_light(light) {}void execute() override {m_light-turnOff();}
private:std::shared_ptrLight m_light;
};// Invoker
class RemoteControl {
public:void setCommand(std::shared_ptrCommand command) {m_command  command;}void pressButton() {m_command-execute();}private:std::shared_ptrCommand m_command;
};int main() {// Receiverstd::shared_ptrLight light  std::make_sharedLight();// Concrete Commandsstd::shared_ptrCommand turnOnCommand  std::make_sharedTurnOnCommand(light);std::shared_ptrCommand turnOffCommand  std::make_sharedTurnOffCommand(light);// InvokerRemoteControl remote;// Set commandsremote.setCommand(turnOnCommand);remote.pressButton(); // Output: Light is onremote.setCommand(turnOffCommand);remote.pressButton(); // Output: Light is offreturn 0;
}