Karp 的技术博客

概述

命令模式是一种行为型设计模式,它将请求封装成一个独立的对象,从而使不同的请求可以被参数化,并且能够将请求的发起者与请求的接收者解耦。

适用场景

命令模式适用于以下情况:

  • 当需要将请求发送者和请求接收者解耦时。
  • 当需要在不同的时间指定、排队和执行请求时。
  • 当需要支持撤销和重做操作时。

结构

命令模式由以下组件组成:

  • 命令(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接口代表命令,ConcreteCommandAConcreteCommandB分别代表具体命令,Receiver代表接收者,Invoker代表请求者。

在客户端代码中,我们创建了一个接收者对象和两个具体命令对象,分别对应不同的操作。然后,我们创建了一个请求者对象,并通过设置具体命令对象来指定要执行的命令。最后,调用请求者对象的执行方法来触发命令的执行。

通过使用命令模式,我们可以将请求发送者和请求接收者解耦,使得请求发送者不需要直接与接收者交互,而是通过命令对象来间接执行请求。

希望这个示例对您有所帮助!

php 设计模式

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2015年12月24日 03:11
2

目录

来自 《PHP设计模式:命令模式》