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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql查找表shoe table,m
- 下一篇: db2存储过程 可以使用游标循环嵌套吗_