命令模式使用实例

功能:

给指定用户发送邮件

将客户端ip写入ftp防火墙白名单

为什么要用命令模式实现?策略模式,状态模式难道不可以吗?

此处给用户发邮件和将IP写入白名单是两个不同的操作.

策略模式是不同策略可以相互替换,这儿显然不能替换,因为对应的功能不同.

命令请求者内部没有维护一个状态的必要.所以状态模式也不适应.

一.命令接口

abstract class SystemCommandInterface
{
    protected $receiver;

    public function __construct(ReceiverInterface $receiver)
    {
        $this->receiver = $receiver;
    }

    abstract public function execute(array $params);
    abstract public function log(array $params);
}

  

二.具体命令

1.发送邮件命令

/**
 * 发送邮件
 * Class SendEmail
 */
class SendEmail extends SystemCommandInterface
{
    public function execute(array $params)
    {
        $this->log($params);
        return $this->receiver->action($params);
    }

    public function log(array $params)
    {
        echo "向{$params['email']}发送了邮件<br/>";
    }

}

  

2.ip写入ftp白名单命令

/**
 * 接受ftp 客户端IP
 */
class AcceptFTPClientIp extends SystemCommandInterface
{
    public function execute(array $params)
    {
        $this->log($params);
        return $this->receiver->action($params);
    }

    public function log(array $params)
    {
        echo "请求接受ftp 客户端IP: {$params['ip']}<br/>";
    }

}

  

三.命令接受者

1.接口

interface ReceiverInterface
{
    public function action(array $params);
}

  

2.发送邮件命令接受者

/**
 * Class SendMailReceiver
 */
class SendMailReceiver implements ReceiverInterface
{
    public function action(array $params)
    {
        /**
         * 发送邮件
         * ..........
         * ........
         */
        return true;
    }
}

  

3.接受ip命令接受者

class AcceptFTPClientIpReceiver implements ReceiverInterface
{
    public function action(array $params)
    {
        /**
         * 将请求的ip写入ftp ip 白名单
         * ..........
         * ........
         */
        return false;
    }
}

  

四.命令请求者

/**
 * 命令请求者
 * Class Invoker
 */
class Invoker
{
    private $systemCommandS = [];

    public function setCommands($key, SystemCommandInterface $commandInterface)
    {
        if (!isset($this->systemCommandS[$key])) {
            $this->systemCommandS[$key] = $commandInterface;
        }
    }

    public function call($key, $params)
    {
        $this->systemCommandS[$key]->execute($params);
    }
}

  

五.调用

$sendMailCommand = new SendEmail(new SendMailReceiver());
$acceptFTPClientIpCommand = new AcceptFTPClientIp(new AcceptFTPClientIpReceiver());

$invoker = new Invoker();
$invoker->setCommands('send_email', $sendMailCommand);
$invoker->setCommands('accept_ftp_client_ip', $acceptFTPClientIpCommand);

$invoker->call('send_email', ['email' => 'example@mail.com']);
$invoker->call('accept_ftp_client_ip', ['ip' => '127.0.0.1']);

  

原文地址:https://www.cnblogs.com/itfenqing/p/8742945.html