php设计模式之命令模式使用示例


在PHP中,命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,从而使你可用不同的请求、队列、日志来参数化其他对象。命令模式也支持可撤销的操作。下面是一个简单的PHP命令模式使用示例:

首先,我们定义一个命令接口,它包含一个执行命令的方法:


interface Command {
    public function execute();
}

然后,我们定义几个具体的命令类,这些类实现了`Command`接口:


class LightOnCommand implements Command {
    private $light;

    public function __construct(Light $light) {
        $this->light = $light;
    }

    public function execute() {
        $this->light->on();
    }
}

class LightOffCommand implements Command {
    private $light;

    public function __construct(Light $light) {
        $this->light = $light;
    }

    public function execute() {
        $this->light->off();
    }
}

注意,上面的示例中引用了`Light`类,它是一个可能的接收者(Receiver)类,用来表示可以被操作的对象,比如灯的开关:


class Light {
    public function on() {
        echo "Light is on\n";
    }

    public function off() {
        echo "Light is off\n";
    }
}

最后,我们需要一个调用者(Invoker)类,它可以接受命令对象并执行它们:


class RemoteControl {
    private $command;

    public function setCommand(Command $command) {
        $this->command = $command;
    }

    public function pressButton() {
        $this->command->execute();
    }
}

// 使用示例
$light = new Light();
$lightOnCommand = new LightOnCommand($light);
$lightOffCommand = new LightOffCommand($light);

$remote = new RemoteControl();
$remote->setCommand($lightOnCommand);
$remote->pressButton();  // 输出: Light is on

$remote->setCommand($lightOffCommand);
$remote->pressButton();  // 输出: Light is off

在这个示例中,`RemoteControl`是调用者,它接受并执行不同的命令对象。这些命令对象封装了`Light`对象的状态变化,即灯的开关操作。这样,通过更换不同的命令对象,调用者(`RemoteControl`)可以在不知道具体操作细节的情况下,执行不同的操作。