php yii 命令行,命令行模式(Command)
命令行模式(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)相关推荐
- vim 底行命令模式下的全局命令 g(global)
文章目录 命令格式介绍 常用的 ex 指令 关于 range 参考示例 结合替换指令 s 使用 将包含 pattern 的行追加到指定的寄存器中 插入空行 打印符合要求的行 删除匹配的行 删除不匹配的 ...
- vim 底行命令模式的正则表达式(匹配模式)
文章目录 一.vim 替换表达式的语法格式 二.vim 关于 range 的表达式 三.vim 关于 flags 的元字符 四.vim 关于数量的元字符 五.环视和固化分组 六.vim 替换表达式的示 ...
- Blat-windows cmd命令行脚本SMTP模式发邮件的开源工具参数详细说明
Blat-windows cmd命令行脚本SMTP模式发邮件的开源工具参数详细说明 blat工具可以在命令行下使用发邮件,所以可能被×××用来盗取计算机文件. 所以(1)不建议安装部署到system3 ...
- python怎么输入两行_python交互模式下输入换行/输入多行命令的方法
先给大家介绍下python交互模式下输入换行/输入多行命令的方法 换行方法 \ 如: >>> print 'aaa'; \ ... print 'bbb'; \ ... print ...
- linux vi 删除行命令,在Vim/Vi中删除行、多行、行范围、所有行及包含模式的行
本文介绍如何在Vim/Vi中删除行,操作系统为Linux.Vim或其早期版本Vi预装在大多数Linux发行版和macOS中,如果您是系统管理员或只是普通的Linux用户,了解Vim的基础很重要,通常, ...
- 命令行界面命令模式及相互切换、交换机命令行操作模式及模式间的切换过程、命令行界面基本功能、命令的快捷键功能、交换机基本配置命令、交换机特权模式下基本命令、交换机全局配置模式下基本命令、
1.命令行界面命令模式及相互切换 锐捷交换机命令行管理界面分成若干不同的模式,用户当前所处的命令模式决定了可以使用的命令,不可跨模式执行命令.以下给出三种基本模式. 用户模式(User EXE ...
- GVIM三种模式—(命令、底行、插入)
文章目录 一.GVIM的三种工作模式 二.命令模式操作 2.1.光标移动 2.2.复制/粘贴(copy/paste) 2.3.剪切/删除(delete) 2.4.改变/替换(change/replac ...
- 【白话设计模式八】命令模式(Command)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- 打开高效文本编辑之门_Linux sed之多行命令与循环命令
Linux sed之多行命令与循环命令使用案例 声明与简介 sed:Stream Editor文本流编辑,sed是一个"非交互式的"面向字符流的编辑器. sed模式匹配是对文件的一 ...
最新文章
- 彻底解决 gcr、quay、DockerHub 镜像下载难题!
- 【Android 应用开发】对Android体系结构的理解--后续会补充
- 特征值与特征向量(二)
- 《深入浅出数据分析》为读者送上了章回小说的精彩
- 在html怎么使用php函数,php htmlentities函数讲解及使用实例
- XX(北京)科技股份公司为啥需要购置服务器?
- 数据科学入门与实战:玩转pandas实战项目分析航班晚点情况
- [导入]全国哀悼日 网站变灰装(附代码)[转]
- Hibernate本机SQL查询示例
- 安装paramiko的方法
- 浏览器文件分段断点上传简单示例(python 篇)
- 广西民族博物馆真好玩
- 【计算摄影】相机成像原理:从光到JPEG图像
- Cesium 获取屏幕所在经纬度范围
- 力学相关公式 传感器计算
- java导出mysql数据表的结构生成word文档
- 建立TCP连接的时候,syn包什么情况下会被对端rst?
- 永恒之蓝MS17-010漏洞复现
- c语言求矩阵各行元素之和
- 跟西乔一起开脑洞,预测AIGC的终极形态
热门文章
- 服务化改造的云上利器 | 阿里云 EDAS 重大升级发布
- 如何保障研发质量不踩坑?阿里技术专家教你几招
- 2017双11技术揭秘—X-DB支撑双11进入分布式数据库时代
- 中文巨量模型“源1.0”:模型结构与生成效果解析
- 智领云荣登“中国大数据企业50强” | 2020大数据产业生态大会盛大召开 智领云斩获多项殊荣
- 万字干货:一步步教你如何在容器上构建持续部署!
- 看完这篇还不会kafka,我跪榴莲!
- 谷歌10月15日发布 Pixel 4;高通以31亿美元收购与TDK公司权益;甲骨文、VMware就云技术及支持达成协议……...
- java 中negate()_Java BigInteger negate()用法及代码示例
- python二叉树去重_python二叉树学习分享