功能:
给指定用户发送邮件
将客户端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']);