• 技术文章 >后端开发 >php教程

    php设计模式 Command(命令模式)_PHP

    2016-06-01 12:15:41原创249
    /**
    * 命令模式
    *
    * 将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化,对请求排除或记录请求日志,以及支持可取消的操作
    */
    interface Command
    {
    public function execute();
    }

    class Invoker
    {
    private $_command = array();
    public function setCommand($command) {
    $this->_command[] = $command;
    }

    public function executeCommand()
    {
    foreach($this->_command as $command)
    {
    $command->execute();
    }
    }

    public function removeCommand($command)
    {
    $key = array_search($command, $this->_command);
    if($key !== false)
    {
    unset($this->_command[$key]);
    }
    }
    }

    class Receiver
    {
    private $_name = null;

    public function __construct($name) {
    $this->_name = $name;
    }

    public function action()
    {
    echo $this->_name." action
    ";
    }

    public function action1()
    {
    echo $this->_name." action1
    ";
    }
    }

    class ConcreteCommand implements Command
    {
    private $_receiver;
    public function __construct($receiver)
    {
    $this->_receiver = $receiver;
    }

    public function execute()
    {
    $this->_receiver->action();
    }
    }

    class ConcreteCommand1 implements Command
    {
    private $_receiver;
    public function __construct($receiver)
    {
    $this->_receiver = $receiver;
    }

    public function execute()
    {
    $this->_receiver->action1();
    }
    }

    class ConcreteCommand2 implements Command
    {
    private $_receiver;
    public function __construct($receiver)
    {
    $this->_receiver = $receiver;
    }

    public function execute()
    {
    $this->_receiver->action();
    $this->_receiver->action1();
    }
    }


    $objRecevier = new Receiver("No.1");
    $objRecevier1 = new Receiver("No.2");
    $objRecevier2 = new Receiver("No.3");

    $objCommand = new ConcreteCommand($objRecevier);
    $objCommand1 = new ConcreteCommand1($objRecevier);
    $objCommand2 = new ConcreteCommand($objRecevier1);
    $objCommand3 = new ConcreteCommand1($objRecevier1);
    $objCommand4 = new ConcreteCommand2($objRecevier2); // 使用 Recevier的两个方法

    $objInvoker = new Invoker();
    $objInvoker->setCommand($objCommand);
    $objInvoker->setCommand($objCommand1);
    $objInvoker->executeCommand();
    $objInvoker->removeCommand($objCommand1);
    $objInvoker->executeCommand();

    $objInvoker->setCommand($objCommand2);
    $objInvoker->setCommand($objCommand3);
    $objInvoker->setCommand($objCommand4);
    $objInvoker->executeCommand();
    [/code]
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:设计模式
    上一篇:php判断输入不超过mysql的varchar字段的长度范围_PHP 下一篇:把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11_PHP
    PHP编程就业班

    相关文章推荐

    • PHP 安装配置教程大全(最新)• 详解win10下PHP的安装配置(以php5.6为例)• YII 的源码分析(3)• 检测旋钮所在行 • PHP5.4无法安装sphinx扩展,该怎么解决

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网