命令模式使用实例

Posted 罗夏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了命令模式使用实例相关的知识,希望对你有一定的参考价值。

功能:

给指定用户发送邮件

将客户端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‘ => ‘[email protected]‘]);
$invoker->call(‘accept_ftp_client_ip‘, [‘ip‘ => ‘127.0.0.1‘]);

  

以上是关于命令模式使用实例的主要内容,如果未能解决你的问题,请参考以下文章

如何使用对象列表在片段中实现newinstace模式[重复]

创建片段而不从 java 代码实例化它

命令模式

设计模式 行为型模式 -- 命令模式(具体实例JDK源码分析:Runable)

如何防止创建相同片段的 2 个实例?

Sublime text3最全快捷键清单