php yii 命令行,命令行模式(Command)

命令行模式(Command)

3.2.1. 目的

为了封装调用和解耦。

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

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

3.2.2. 例子

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

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

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

3.2.3. UML 图

hSXJ3cYequ.png

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());

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么让PHP网页显示时有表格的效果,html的table用法(让网页的视觉效果显示出来)...

我们知道在网易博客可以用html时,是否把代码直接加入到摸板中,但是效果却不是很好。那是因为没有对代码进行很好的排列,现在我说一下用table来排列,可以很好的把特效显示出来。在html语法中table(即表格)是不可少的部分&#xff0…

php 数组排序 按值,php – 按值排序数组

我正在为我的论坛创建一个“固定”功能,我正在寻找一种方法将我的固定主题放在数组的开头,以便它们“卡在”页面的顶部.如果主题没有固定,则topic_pinned NULL,如果它被固定,则topic_pinned 0.该数组按topic_updated排序.固定主题需要在保留在页面顶部时按topic_updated保持排…

php语句结束标记,PHP结束标记“?”

本问题已经有最佳答案,请猛点这里访问。我有一个PHP结束标记的有趣现象。 我有一个由Ajax调用执行的php文件。 在php文件中包含了一个具有各种功能的php库文件。 当这个库被包含时,php响应包括一堆空行。 当我从库中删除结束标记时,这种情况就…

php 获取 js json数据类型,JS基础-JS的数据类型和访问/流程控制/JSON格式字符串和js对象相互转换...

JS的数据类型和访问/流程控制/JSON格式字符串和js对象相互转换1. JS的数据类型和访问1.1. 原始类型JS中的原始数据类型有: number , string , boolean ;声明变量使用 var 关键字./* 数字类型 */varyear2020;/* 字符串类型 */varnamezhangsan;/* 布尔类型 */varisUpdatefalse;获…

在matlab中使用spm8,在matlab中同时使用spm2,spm5,spm8

1、设置好spm2,spm5,spm8的路径。例如,都放置在“D:\Analysis_Software”2、新建一个文件夹spm_paths,用于放置调用spm2,spm5,spm8的*.m文件3、将spm_paths在matlab中进行setpath4、调用文件编写如下&#…

matlab 打开软件报错,matlab程序错误,提示如下【弄了半夜还是不行】 - 数学 - 小木虫 - 学术 科研 互动社区...

function [x,y,Y]levydistrintheorytest(t0,lambda,T,a,b);% 计算理论的二维levy分布的图象 画出来的3维曲面图% t0 :levy walk 趋于零的时间% lambda :幂律值% T:时间% a: 离散的大步长的最大值% b:小步长的最大值e…

php 上传根目录不存在,Linux 下 ---ThinkPHP 图片上传提示:上传根目录不存在!请尝试手动创建...

2016年11月15日11:15:47Windows下如果碰到如此问题,要看文件保存根路径里的rootpath,比如ThinkPHP框架里config.php文件里的的参数配置://文件上传相关配置‘UPLOAD_CONFIG‘ > array(‘mimes‘ > ‘‘, //允许上传的文件MiMe类型‘max…

mysql二级缓存,mybatis的动态sql和二级缓存

mybatis的#{}和${}的区别就像是 PreparedStatement 和statement , 使用${}接收的参数还需用Param注解修饰 , 推荐用#{}动态SQLMyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如…

mysql查找表shoe table,mysql命令行常用命令

mysql服务的启动和停止net stop mysqlnet start mysql登陆mysql服务器mysql -u用户名 -p用户密码注意,如果是连接到另外的机器上,则需要加入一个参数-h机器IP增加新用户grant 权限 on 数据库.* to 用户名登录主机 identified by “密码”如&#…

java long bigdecimal,通过Java中的long创建BigDecimal值

让我们看看如何通过long创建BigDecimal值。在这里,我们将长值设置为BigDecimal构造函数的参数。BigDecimal val1 BigDecimal.valueOf(289L);BigDecimal val2 BigDecimal.valueOf(299L);我们还可以对其执行数学运算-val2 val2.subtract(val1);以下是一个例子-示例…

python 数据挖掘论文,Orange:一个基于 Python 的数据挖掘和机器学习平台

Orange 简介Orange 是一个开源的数据挖掘和机器学习软件。Orange 基于 Python 和 C/C 开发,提供了一系列的数据探索、可视化、预处理以及建模组件。Orange 拥有漂亮直观的交互式用户界面,非常适合新手进行探索性数据分析和可视化展示;同时高级…

php量表是什么心理量表,心理学中的“5大心理学测评量表”你知道多少?

原标题:心理学中的“5大心理学测评量表”你知道多少?心理学知识中涵盖了类型丰富的心理学测评量表,你知道其中的多少呢?1、《应对方式问卷》《应对方式问卷》由肖计划等人参照国内外应对研究的问卷内容以及有关应对理论&#xff0…

php获取表单内的值,PHP获取表单里各项值总结

表单提交的方式1、GET方式功能:获取get方式提交的数据格式:$_GET[“formelement”]2、POST方式功能:获取post方式提交的数据格式:$_POST[“formelement”]3、REQUEST方式功能:获取任意方式提交的数据格式:$…

php对象魔术方法,php学习之类与对象的魔术方法的使用

原标题:php学习之类与对象的魔术方法的使用魔术方法有哪些__construct:构造方法__destuct:析构方法__call:在对象中调用一个不可访问的方法时。__call()会被调用__callStatic:__get:调用不可访问的属性__se…

oracle 执行sql,Oracle动态执行SQL

方式1CREATE OR REPLACE PROCEDURE demo(salary IN NUMBER) AScursor_name INTEGER;rows_processed INTEGER;BEGINcursor_name : dbms_sql.open_cursor;dbms_sql.parse(cursor_name, DELETE FROM emp WHERE sal > :x,dbms_sql);dbms_sql.bind_variable(cursor_name, :x, sal…

oracle 满足条件取第一行,sql – 如何只选择满足条件的第一行?

您可以使用分析查询:select *from (select p.*, v.*,row_number() over (partition by p.id order by v.userid) as rnfrom prmprofile pjoin user v on v.profile p.idwhere p.language 0and v.userid like %TEST%)where rn 1;内部查询获取所有数据(但使用*不理…

Linux怎么把目录设置群组,linux设置目录和文件使用权限

ext2fs文件系统中的目录及文件,可依实际需要来设置可读取、可写入与可执行等权限。以下我们就来了解文件和目录的权限设置。ext2fs文件系统中的目录及文件,可依实际需要来设置可读取、可写入与可执行等权限。以下我们就来了解文件和目录的权限设置&#…

linux异常关机内存,linux关机及问题解决

一般linux关机会用到的命令就是shutdown命令shutdown命令在执行的时候会自动去调用sync这个工具,这个工具的作用是把内存里面的东西写入硬盘。不过为了安全,一般我们在执行shutdown命令的时候都用去执行几次sync这个命令。shutdown -k noticesshutdown -…

linux查看redis内存,Linux查看redis占用内存的方法

redis-cliauth 密码info# Memoryused_memory:13490096 //数据占用了多少内存(字节)used_memory_human:12.87M //数据占用了多少内存(带单位的,可读性好)used_memory_rss:13490096 //redis占用了多少内存used_memory_peak:15301192 //占用内存的峰值(字节)used_memor…

linux子进程父进程例子,linux 子进程访问父进程

问题分析ECS Linux 系统下 Apache 的默认工作模式是 prefork MPM,使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接,效率高,但内存占用量比较大。如果不做调整,访问量增大可能造成 A…