概述
命令模式是一种行为型设计模式,它将请求封装成一个独立的对象,从而使不同的请求可以被参数化,并且能够将请求的发起者与请求的接收者解耦。
适用场景
命令模式适用于以下情况:
- 当需要将请求发送者和请求接收者解耦时。
- 当需要在不同的时间指定、排队和执行请求时。
- 当需要支持撤销和重做操作时。
结构
命令模式由以下组件组成:
- 命令(Command):命令接口定义了执行命令的方法。
- 具体命令(Concrete Command):具体命令类实现了命令接口,并将命令和接收者对象进行绑定。
- 接收者(Receiver):接收者对象负责执行命令所对应的操作。
- 请求者/调用者(Invoker):请求者对象持有一个命令对象,并在需要执行命令时调用命令对象的执行方法。
示例
<?php
// 命令接口
interface Command
{
public function execute();
}
// 具体命令A
class ConcreteCommandA implements Command
{
private $receiver;
public function __construct(Receiver $receiver)
{
$this->receiver = $receiver;
}
public function execute()
{
$this->receiver->performActionA();
}
}
// 具体命令B
class ConcreteCommandB implements Command
{
private $receiver;
public function __construct(Receiver $receiver)
{
$this->receiver = $receiver;
}
public function execute()
{
$this->receiver->performActionB();
}
}
// 接收者
class Receiver
{
public function performActionA()
{
echo "执行接收者的操作A。" . PHP_EOL;
}
public function performActionB()
{
echo "执行接收者的操作B。" . PHP_EOL;
}
}
// 请求者
class Invoker
{
private $command;
public function setCommand(Command $command)
{
$this->command = $command;
}
public function executeCommand()
{
$this->command->execute();
}
}
// 客户端代码
$receiver = new Receiver();
$commandA = new ConcreteCommandA($receiver);
$commandB = new ConcreteCommandB($receiver);
$invoker = new Invoker();
// 设置并执行具体命令A
$invoker->setCommand($commandA);
$invoker->executeCommand();
// 设置并执行具体命令B
$invoker->setCommand($commandB);
$invoker->executeCommand();
在上面的示例中,我们定义了一个命令模式的实现。其中,Command
接口代表命令,ConcreteCommandA
和ConcreteCommandB
分别代表具体命令,Receiver
代表接收者,Invoker
代表请求者。
在客户端代码中,我们创建了一个接收者对象和两个具体命令对象,分别对应不同的操作。然后,我们创建了一个请求者对象,并通过设置具体命令对象来指定要执行的命令。最后,调用请求者对象的执行方法来触发命令的执行。
通过使用命令模式,我们可以将请求发送者和请求接收者解耦,使得请求发送者不需要直接与接收者交互,而是通过命令对象来间接执行请求。
希望这个示例对您有所帮助!