学习PHP设计模式是PHP开发者提升自己技能的重要途径之一,其中命令模式是一种常用的设计模式。下面就为大家介绍如何学习PHP实现命令模式的攻略。
什么是命令模式?
命令模式是一种行为型设计模式,它将请求封装成对象,以便于参数化和传递给不同的方法。这个模式允许请求的发送者和接收者之间解耦,通过对象进行调用。
如何实现命令模式?
在实现命令模式时,需要创建一个接口,该接口定义了执行特定操作所需的方法。然后,每个命令都将实现此接口,并实现其自己的操作。命令模式还需要一个类来存储命令及其参数。最后,一个调用者将接收一个命令,并执行该命令。
实现步骤
- 定义Command接口,该接口包含execute方法,该方法将在实现类中重写,并执行相应的操作。
interface Command
{
public function execute();
}
- 创建实现此接口的具体命令类。每个命令都将实现此接口,并实现其自己的操作。
class CreateOrderCommand implements Command
{
public function execute()
{
return "Order created successfully!";
}
}
class UpdateOrderCommand implements Command
{
public function execute()
{
return "Order updated successfully!";
}
}
- 创建命令存储类(CommandInvoker),并在该类中存储命令及其参数。
class CommandInvoker
{
private $command;
public function setCommand(Command $command)
{
$this->command = $command;
}
public function executeCommand()
{
return $this->command->execute();
}
}
- 调用者将持有CommandInvoker对象,并将命令与该对象绑定,并调用该对象的executeCommand方法来执行命令。
$commandInvoker = new CommandInvoker();
$createOrderCommand = new CreateOrderCommand();
$commandInvoker->setCommand($createOrderCommand);
echo $commandInvoker->executeCommand();
$updateOrderCommand = new UpdateOrderCommand();
$commandInvoker->setCommand($updateOrderCommand);
echo $commandInvoker->executeCommand();
示例说明
接下来,通过示例来进一步说明如何使用命令模式。我们将创建一个简单的命令,来打印一条消息。首先定义Command接口和ConcreteCommand类,实现execute方法并具体的执行打印消息的操作。
interface Command
{
public function execute();
}
class PrintCommand implements Command
{
private $message;
public function __construct($message)
{
$this->message = $message;
}
public function execute()
{
echo $this->message;
}
}
然后,我们可以创建一个CommandInvoker,在该类中,我们可以存储我们要执行的特定命令,并调用executeCommand方法来执行它。
class CommandInvoker
{
private $command;
public function setCommand(Command $command)
{
$this->command = $command;
}
public function executeCommand()
{
$this->command->execute();
}
}
最后,我们可以将我们的命令绑定到CommandInvoker上,并执行它。
$commandInvoker = new CommandInvoker();
$command = new PrintCommand("Hello World!");
$commandInvoker->setCommand($command);
$commandInvoker->executeCommand();
当执行上面的代码时,会输出“Hello World!”。
另一个例子是使用命令模式来撤销一些操作。我们可以创建一个命令类,用于执行特定的操作。然后我们创建一个存储命令对象的数组,以便于我们可以撤销最后一个操作。
interface Command
{
public function execute();
public function undo();
}
class IncreaseCommand implements Command
{
private $receiver;
private $value;
public function __construct(Receiver $receiver, $value)
{
$this->receiver = $receiver;
$this->value = $value;
}
public function execute()
{
$this->receiver->increase($this->value);
}
public function undo()
{
$this->receiver->decrease($this->value);
}
}
class Receiver
{
private $value = 0;
public function increase($value)
{
$this->value += $value;
}
public function decrease($value)
{
$this->value -= $value;
}
public function getValue()
{
return $this->value;
}
}
class CommandInvoker
{
private $commands = [];
public function addCommand(Command $command)
{
$this->commands[] = $command;
}
public function undoCommand()
{
if (count($this->commands) > 0) {
$command = array_pop($this->commands);
$command->undo();
}
}
}
然后,我们可以创建一个Receiver类,我们在其中保存当前值。当执行增量命令{@see IncreaseCommand}时,我们可以更新当前值。我们还需要在命令存储类CommandInvoker中添加addCommand和undoCommand方法。通过addCommand方法,我们可以将一个命令对象添加到内部存储数组中。通过undoCommand方法,我们可以将最后一个命令对象从内部存储数组中弹出,然后调用undo方法进行撤销操作。
$receiver = new Receiver();
$commandInvoker = new CommandInvoker();
$command1 = new IncreaseCommand($receiver, 10);
$command2 = new IncreaseCommand($receiver, 20);
$command3 = new IncreaseCommand($receiver, 30);
$commandInvoker->addCommand($command1);
$commandInvoker->addCommand($command2);
$commandInvoker->addCommand($command3);
echo "Current value: " . $receiver->getValue() . PHP_EOL;
$commandInvoker->undoCommand();
echo "Current value: " . $receiver->getValue() . PHP_EOL;
$commandInvoker->undoCommand();
echo "Current value: " . $receiver->getValue() . PHP_EOL;
$commandInvoker->undoCommand();
echo "Current value: " . $receiver->getValue() . PHP_EOL;
当执行上面的代码时,会输出以下结果:
Current value: 60
Current value: 30
Current value: 10
Current value: 0
以上就是学习PHP实现命令模式的完整攻略,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:学习php设计模式 php实现命令模式(command) - Python技术站