命令模式(Command Pattern)是一种行为设计模式,它将请求封装为对象,从而使您可以使用不同的请求、队列或日志请求,以及支持可撤销操作。命令模式的主要组成部分包括:
下面是一个简单的 C++ 示例,展示了命令模式的实现:
#include
#include
#include
// 命令接口
class Command {
public:
virtual void execute() = 0;
virtual ~Command() = default;
};
// 接收者
class Light {
public:
void turnOn() {
std::cout << "Light is ON" << std::endl;
}
void turnOff() {
std::cout << "Light is OFF" << std::endl;
}
};
// 具体命令
class TurnOnCommand : public Command {
private:
Light& light;
public:
TurnOnCommand(Light& l) : light(l) {}
void execute() override {
light.turnOn();
}
};
class TurnOffCommand : public Command {
private:
Light& light;
public:
TurnOffCommand(Light& l) : light(l) {}
void execute() override {
light.turnOff();
}
};
// 调用者
class RemoteControl {
private:
std::unique_ptr<Command> command;
public:
void setCommand(std::unique_ptr<Command> cmd) {
command = std::move(cmd);
}
void pressButton() {
if (command) {
command->execute();
}
}
};
// 客户端
int main() {
Light livingRoomLight;
TurnOnCommand turnOn(livingRoomLight);
TurnOffCommand turnOff(livingRoomLight);
RemoteControl remote;
// 打开灯
remote.setCommand(std::make_unique<TurnOnCommand>(livingRoomLight));
remote.pressButton();
// 关闭灯
remote.setCommand(std::make_unique<TurnOffCommand>(livingRoomLight));
remote.pressButton();
return 0;
}
代码分析:
这种模式的优点是可以将请求的发送者和接收者解耦,支持命令的撤销和重做等功能。
class DeviceFactory {
public:
static DeviceFactory& instance() {
static DeviceFactory instance;
return instance;
}
//这里写的太死了,看命令模式
Device* createDevice(const DeviceConfig& config) {
if (config.type() == "万用表") {
return new MultimeterDevice(QUuid::createUuid().toString(), config);
} else if (config.type() == "示波器") {
return new Oscilloscope(QUuid::createUuid().toString(), config);
}
return nullptr;
}
private:
DeviceFactory() = default;
DeviceFactory(const DeviceFactory&) = delete;
DeviceFactory& operator=(const DeviceFactory&) = delete;
};
为了使 DeviceFactory 更加灵活并支持新的设备类型而不需要修改现有代码,可以使用命令模式和注册机制。通过将设备的创建逻辑从工厂中分离出来,并使用一个注册表来管理设备类型及其对应的创建命令,可以实现更好的扩展性。
实现步骤
代码示例
以下是使用命令模式和注册机制的示例代码:
#include
#include
#include
#include
#include
#include
// 设备接口
class Device {
public:
virtual void operate() = 0;
virtual ~Device() = default;
};
// 具体设备类
class MultimeterDevice : public Device {
public:
MultimeterDevice(const QString& id, const DeviceConfig& config) {
// 初始化万用表
}
void operate() override {
std::cout << "Operating Multimeter" << std::endl;
}
};
class Oscilloscope : public Device {
public:
Oscilloscope(const QString& id, const DeviceConfig& config) {
// 初始化示波器
}
void operate() override {
std::cout << "Operating Oscilloscope" << std::endl;
}
};
// 设备创建命令接口
class DeviceCommand {
public:
virtual Device* create(const DeviceConfig& config) = 0;
virtual ~DeviceCommand() = default;
};
// 具体命令类
class MultimeterCommand : public DeviceCommand {
public:
Device* create(const DeviceConfig& config) override {
return new MultimeterDevice(QUuid::createUuid().toString(), config);
}
};
class OscilloscopeCommand : public DeviceCommand {
public:
Device* create(const DeviceConfig& config) override {
return new Oscilloscope(QUuid::createUuid().toString(), config);
}
};
// 工厂类
class DeviceFactory {
public:
static DeviceFactory& instance() {
static DeviceFactory instance;
return instance;
}
void registerDevice(const QString& type, std::unique_ptr<DeviceCommand> command) {
commands[type] = std::move(command);
}
Device* createDevice(const DeviceConfig& config) {
auto it = commands.find(config.type());
if (it != commands.end()) {
return it->second->create(config);
}
return nullptr;
}
private:
DeviceFactory() = default;
DeviceFactory(const DeviceFactory&) = delete;
DeviceFactory& operator=(const DeviceFactory&) = delete;
std::unordered_map<QString, std::unique_ptr<DeviceCommand>> commands;
};
// 客户端代码
int main() {
DeviceFactory& factory = DeviceFactory::instance();
// 注册设备类型
factory.registerDevice("万用表", std::make_unique<MultimeterCommand>());
factory.registerDevice("示波器", std::make_unique<OscilloscopeCommand>());
DeviceConfig config1; // 假设已设置为万用表配置
Device* device1 = factory.createDevice(config1);
if (device1) {
device1->operate();
delete device1; // 记得释放内存
}
DeviceConfig config2; // 假设已设置为示波器配置
Device* device2 = factory.createDevice(config2);
if (device2) {
device2->operate();
delete device2; // 记得释放内存
}
return 0;
}
代码分析:
优点: