继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

PHP设计模式(十七)—命令模式 (Command Pattern)

刀斧手何在
关注TA
已关注
手记 35
粉丝 122
获赞 607

命令模式 (Command Pattern): 将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。

(一)为什么需要命令模式

1, 使用命令模式,能够让请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。

2,使用命令模式可以比较容易地设计一个命令队列和宏命令(组合命令),而且新的命令可以很容易地加入系统

(二)命令模式 UML图
图片描述
(三)简单实例

有关命令模式的一个经典的例子,就是电视机与遥控器。如果按照命令模式的UML图那么,就有这样的对应关系:电视机是请求的接收者,遥控器是请求的发送者。遥控器上有一些按钮,不同的按钮对应电视机的不同操作。这些按钮就是对应的具体命令类。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。

<?php
//抽象命令角色
abstract class Command{
  protected $receiver;
  function __construct(TV $receiver)
  {
      $this->receiver = $receiver;
  }
  abstract public function execute();
}
//具体命令角色 开机命令
class CommandOn extends Command
{
  public function execute()
  {
      $this->receiver->action();
  }
}
//具体命令角色 关机机命令
class CommandOff extends Command
{
  public function execute()
  {
      $this->receiver->action();
  }
}
//命令发送者   --遥控器
class Invoker
{
  protected $command;
  public function setCommand(Command $command)
  {
      $this->command = $command;
  }

  public function send()
  {
      $this->command->execute();
  }
}
//命令接收者 Receiver =》 TV
class TV
{
  public function action()
  {
      echo "接收到命令,执行成功".PHP_EOL;
  }
}

//实例化命令接收者 -------买一个电视机
$receiver = new TV();
//实例化命令发送者-------配一个遥控器
$invoker  = new Invoker();
//实例化具体命令角色 -------设置遥控器按键匹配电视机
$commandOn = new CommandOn($receiver);
$commandOff = new CommandOff($receiver);
//设置命令  ----------按下开机按钮
$invoker->setCommand($commandOn);
//发送命令
$invoker->send();
//设置命令  -----------按下关机按钮
$invoker->setCommand($commandOff);
//发送命令
$invoker->send();

在实际使用中,命令模式的receiver经常是一个抽象类,就是对于不同的命令,它都有对应的具体命令接收者。命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP

热门评论

假设有一个文本编辑器程序,它需要支持例如打开文件、保存文件、复制粘贴等。

可以用下面例子,博主分享的文章我都看了很有用,也非常感谢博主的分享,但是这个命令模式,没有怎么看懂,于是写了如下例子便于人看懂,还有这个慕课太垃圾了吧,评论功能太难用了,字数还限制我还要分很多段来写,编辑区域太小,根本不好发挥。

// 定义命令接口
interface Command {
    public function execute();
}
// 定义打开文件命令
class OpenFileCommand implements Command {
    private $file;
    public function __construct($file) {
        $this->file = $file;
    }
    public function execute() {
        // 打开文件的具体实现
        echo "打开文件:{$this->file}\n";
    }
}
// 定义保存文件命令
class SaveFileCommand implements Command {
    private $file;
    public function __construct($file) {
        $this->file = $file;
    }
    public function execute() {
        // 保存文件的具体实现
        echo "保存文件:{$this->file}\n";
    }
}
// 定义复制命令
class CopyCommand implements Command {
    public function execute() {
        // 复制的具体实现
        echo "复制\n";
    }
}
// 定义粘贴命令
class PasteCommand implements Command {
    public function execute() {
        // 粘贴的具体实现
        echo "粘贴\n";
    }
}


// 定义文本编辑器程序
class TextEditor {
    private $commands = array();
    public function addCommand($command) {
        $this->commands[] = $command;
    }
    public function runCommands() {
        foreach ($this->commands as $command) {
            $command->execute();
        }
    }
}


查看全部评论