命令行模式(Command)

3.2.1. 目的

为了封装调用和解耦。

我们有一个调用程序和一个接收器。 这种模式使用「命令行」将方法调用委托给接收器并且呈现相同的「执行」方法。 因此,调用程序只知道调用「执行」去处理客户端的命令。接收器会从调用程序中分离出来。

这个模式的另一面是取消方法的 execute(),也就是 undo() 。命令行也可以通过最小量的复制粘贴和依赖组合(不是继承)被聚合,从而组合成更复杂的命令集。

3.2.2. 例子

文本编辑器:所有事件都是可以被解除、堆放,保存的命令。

Symfony2:SF2 命令可以从 CLI 运行,它的建立只需考虑到命令行模式。

大型 CLI 工具使用子程序来分发不同的任务并将它们封装在「模型」中,每个模块都可以通过命令行模式实现(例如:vagrant)。

3.2.3. UML 图

3.2.4. Code

你也可以在GitHub上查看 源码

CommandInterface.php

namespace DesignPatterns\Behavioral\Command;

interface CommandInterface

{

/**

* 这是在命令行模式中很重要的方法,

* 这个接收者会被载入构造器

*/

public function execute();

}

HelloCommand.php

namespace DesignPatterns\Behavioral\Command;

/**

* 这个具体命令,在接收器上调用 "print" ,

* 但是外部调用者只知道,这个是否可以执行。

*/

class HelloCommand implements CommandInterface

{

/**

* @var Receiver

*/

private $output;

/**

* 每个具体的命令都来自于不同的接收者。

* 这个可以是一个或者多个接收者,但是参数里必须是可以被执行的命令。

*

* @param Receiver $console

*/

public function __construct(Receiver $console)

{

$this->output = $console;

}

/**

* 执行和输出 "Hello World".

*/

public function execute()

{

// 有时候,这里没有接收者,并且这个命令执行所有工作。

$this->output->write('Hello World');

}

}

Receiver.php

namespace DesignPatterns\Behavioral\Command;

/**

* 接收方是特定的服务,有自己的 contract ,只能是具体的实例。

*/

class Receiver

{

/**

* @var bool

*/

private $enableDate = false;

/**

* @var string[]

*/

private $output = [];

/**

* @param string $str

*/

public function write(string $str)

{

if ($this->enableDate) {

$str .= ' ['.date('Y-m-d').']';

}

$this->output[] = $str;

}

public function getOutput(): string

{

return join("\n", $this->output);

}

/**

* 可以显示消息的时间

*/

public function enableDate()

{

$this->enableDate = true;

}

/**

* 禁止显示消息的时间

*/

public function disableDate()

{

$this->enableDate = false;

}

}

Invoker.php

namespace DesignPatterns\Behavioral\Command;

/**

*调用者使用这种命令。

* 比例 : 一个在 SF2 中的应用

*/

class Invoker

{

/**

* @var CommandInterface

*/

private $command;

/**

* 在这种调用者中,我们发现,订阅命令也是这种方法

* 还包括:堆栈、列表、集合等等

*

* @param CommandInterface $cmd

*/

public function setCommand(CommandInterface $cmd)

{

$this->command = $cmd;

}

/**

* 执行这个命令;

* 调用者也是用这个命令。

*/

public function run()

{

$this->command->execute();

}

}

3.2.5. Test

Tests/CommandTest.php

namespace DesignPatterns\Behavioral\Command\Tests;

use DesignPatterns\Behavioral\Command\HelloCommand;

use DesignPatterns\Behavioral\Command\Invoker;

use DesignPatterns\Behavioral\Command\Receiver;

use PHPUnit\Framework\TestCase;

class CommandTest extends TestCase

{

public function testInvocation()

{

$invoker = new Invoker();

$receiver = new Receiver();

$invoker->setCommand(new HelloCommand($receiver));

$invoker->run();

$this->assertEquals('Hello World', $receiver->getOutput());

}

}

php yii 命令行,命令行模式(Command)相关推荐

  1. vim 底行命令模式下的全局命令 g(global)

    文章目录 命令格式介绍 常用的 ex 指令 关于 range 参考示例 结合替换指令 s 使用 将包含 pattern 的行追加到指定的寄存器中 插入空行 打印符合要求的行 删除匹配的行 删除不匹配的 ...

  2. vim 底行命令模式的正则表达式(匹配模式)

    文章目录 一.vim 替换表达式的语法格式 二.vim 关于 range 的表达式 三.vim 关于 flags 的元字符 四.vim 关于数量的元字符 五.环视和固化分组 六.vim 替换表达式的示 ...

  3. Blat-windows cmd命令行脚本SMTP模式发邮件的开源工具参数详细说明

    Blat-windows cmd命令行脚本SMTP模式发邮件的开源工具参数详细说明 blat工具可以在命令行下使用发邮件,所以可能被×××用来盗取计算机文件. 所以(1)不建议安装部署到system3 ...

  4. python怎么输入两行_python交互模式下输入换行/输入多行命令的方法

    先给大家介绍下python交互模式下输入换行/输入多行命令的方法 换行方法 \ 如: >>> print 'aaa'; \ ... print 'bbb'; \ ... print ...

  5. linux vi 删除行命令,在Vim/Vi中删除行、多行、行范围、所有行及包含模式的行

    本文介绍如何在Vim/Vi中删除行,操作系统为Linux.Vim或其早期版本Vi预装在大多数Linux发行版和macOS中,如果您是系统管理员或只是普通的Linux用户,了解Vim的基础很重要,通常, ...

  6. 命令行界面命令模式及相互切换、交换机命令行操作模式及模式间的切换过程、命令行界面基本功能、命令的快捷键功能、交换机基本配置命令、交换机特权模式下基本命令、交换机全局配置模式下基本命令、

    1.命令行界面命令模式及相互切换   锐捷交换机命令行管理界面分成若干不同的模式,用户当前所处的命令模式决定了可以使用的命令,不可跨模式执行命令.以下给出三种基本模式.   用户模式(User EXE ...

  7. GVIM三种模式—(命令、底行、插入)

    文章目录 一.GVIM的三种工作模式 二.命令模式操作 2.1.光标移动 2.2.复制/粘贴(copy/paste) 2.3.剪切/删除(delete) 2.4.改变/替换(change/replac ...

  8. 【白话设计模式八】命令模式(Command)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  9. 打开高效文本编辑之门_Linux sed之多行命令与循环命令

    Linux sed之多行命令与循环命令使用案例 声明与简介 sed:Stream Editor文本流编辑,sed是一个"非交互式的"面向字符流的编辑器. sed模式匹配是对文件的一 ...

最新文章

  1. 彻底解决 gcr、quay、DockerHub 镜像下载难题!
  2. 【Android 应用开发】对Android体系结构的理解--后续会补充
  3. 特征值与特征向量(二)
  4. 《深入浅出数据分析》为读者送上了章回小说的精彩
  5. 在html怎么使用php函数,php htmlentities函数讲解及使用实例
  6. XX(北京)科技股份公司为啥需要购置服务器?
  7. 数据科学入门与实战:玩转pandas实战项目分析航班晚点情况
  8. [导入]全国哀悼日 网站变灰装(附代码)[转]
  9. Hibernate本机SQL查询示例
  10. 安装paramiko的方法
  11. 浏览器文件分段断点上传简单示例(python 篇)
  12. 广西民族博物馆真好玩
  13. 【计算摄影】相机成像原理:从光到JPEG图像
  14. Cesium 获取屏幕所在经纬度范围
  15. 力学相关公式 传感器计算
  16. java导出mysql数据表的结构生成word文档
  17. 建立TCP连接的时候,syn包什么情况下会被对端rst?
  18. 永恒之蓝MS17-010漏洞复现
  19. c语言求矩阵各行元素之和
  20. 跟西乔一起开脑洞,预测AIGC的终极形态

热门文章

  1. 服务化改造的云上利器 | 阿里云 EDAS 重大升级发布
  2. 如何保障研发质量不踩坑?阿里技术专家教你几招
  3. 2017双11技术揭秘—X-DB支撑双11进入分布式数据库时代
  4. 中文巨量模型“源1.0”:模型结构与生成效果解析
  5. 智领云荣登“中国大数据企业50强” | 2020大数据产业生态大会盛大召开 智领云斩获多项殊荣
  6. 万字干货:一步步教你如何在容器上构建持续部署!
  7. 看完这篇还不会kafka,我跪榴莲!
  8. 谷歌10月15日发布 Pixel 4;高通以31亿美元收购与TDK公司权益;甲骨文、VMware就云技术及支持达成协议……...
  9. java 中negate()_Java BigInteger negate()用法及代码示例
  10. python二叉树去重_python二叉树学习分享