• 命令模式使用实例


    功能:

    给指定用户发送邮件

    将客户端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']);
    

      

  • 相关阅读:
    通过URL地址将图片保存到本地
    Sql批量提交方法
    MySql 批量提交方法
    【Sqlserver】查看所有数据库的大小 创建日期 名称 版本级别 状态
    【asp.net】滑块验证码(分享一个从github上下载的源码)
    【winform】 WeifenLuo.WinFormsUI.Docking.dll 组件学习
    【C#】初次使用webapi的体会
    【C#】 封装的异步HttpRequest
    Android实现双时间选择器
    Android的金额3位数加逗号分隔
  • 原文地址:https://www.cnblogs.com/itfenqing/p/8742945.html
Copyright © 2020-2023  润新知