26 05 2020

命令模式

模式定义

命令模式(Command)将请求封装成对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。


命令模式的优势

降低系统的耦合度  

新的命令可以很容易地加入到系统中  

可以比较容易地设计一个组合命令  


代码示例

Command\CommandInterface.class.php
<?php

namespace Command;

interface CommandInterface
{
    public function execute();
}


Command\HelloCommand.class.php
<?php

namespace Command;

class HelloCommand implements CommandInterface
{
    protected $output;

    public function __construct(Receiver $console)
    {
        $this->output = $console;
    }

    public function execute()
    {
        $this->output->write("Hello World\n");
    }
}


Command\Receiver.class.php
<?php
namespace Command;

class Receiver
{
    public function write($str)
    {
        echo $str;
    }
}


Command\Invoker.class.php
<?php

namespace Command;

class Invoker
{
    protected $command;

    public function setCommand(CommandInterface $cmd)
    {
        $this->command = $cmd;
    }

    public function run()
    {
        $this->command->execute();
    }
}


Command\CommandTest.php
<?php
spl_autoload_register(function ($className){
    $className = str_replace("\\", "/", $className);
    include $className . ".class.php";
});

use Command\Invoker;
use Command\Receiver;
use Command\HelloCommand;

$invoker = new Invoker();
$receiver = new Receiver();

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

$invoker->run();


测试示例:

php Command/CommandTest.php 
输出:
Hello World


总结

命令模式就是将一组对象的相似行为,进行了抽象,将调用者与被调用者之间进行解耦,提高了应用的灵活性。命令模式将调用的目标对象的一些异构性给封装起来,通过统一的方式来为调用者提供服务。




代码地址:https://github.com/798256478/design-patterns/tree/master/Command