• 设计模式学习(七)、命令模式


    1.命令模式的概念:

    将请求封装成对象,这样可以让你使用不同的请求、队列、或者日志请问来参数化其他对象。命令模式也支持撤销操作。

    2.命令模式的结构图

    3.命令模式角色说明

    调用者(invoker)角色:这个调用者持有一个命令对象,并在某个时刻调用命令对象的excute()方法,将请求付诸实行。
    命令(command)角色:为所有的命令声明一个接口,调用命令对象的excute()方法,就可以让接收者进行先关的动作。这个接口也具备一个undo()方法。调用者(invoker)角色:这个调用者持有一个命令对象,并在某个时刻调用命令对象的excute()方法,将请求付诸实行。
    具体命令(ConcreteCommand)角色:定义了动作和接收者之间的绑定关系。
    接收者(receiver)角色:这个接收者知道如何进行必要的工作。

    4.命令模式的实现

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 16-10-21
     * Time: 上午10:19
     */
    /*
     * 抽象命令接口
     */
    interface Command
    {
        public function execute();
        public function undo();
    }
    /*
     * 具体命令
     */
    Class ConcreteCommand1 implements Command{
        public $receiver;
        public function __construct($receiver){
            $this->receiver = $receiver;
        }
        public function execute(){
            $this->receiver ->action();
        }
        public function undo(){
            echo '取消concreteCommand1 操作<br>';
        }
    }
    /*
     * 具体命令
     */
    Class NoCommand implements Command{
        public function __construct(){
        }
        public function execute(){
            echo 'no command<br>';
        }
        public function undo(){
            echo 'no undo<br>';
        }
    }
    /*
     * 具体命令
     */
    Class ConcreteCommand2 implements Command{
        public $receiver;
        public function __construct($receiver){
            $this->receiver = $receiver;
        }
        public function execute(){
            $this->receiver ->action();
    
        }
        public function undo(){
            $this->receiver ->action1();
        }
    }
    /*
     * 接收者
     */
    Class Receiver1{
        public function action(){
            echo 'Receiver1 action<br>';
        }
        public function action1(){
            echo '取消 Receiver1 action<br>';
        }
    }
    /*
     * 接收者
     */
    Class Receiver2{
        public function action(){
            echo 'Receiver2 action';
        }
        public function action1(){
            echo '取消 Receiver2 action';
        }
    }
    /*
     * 调用者
     */
    Class Invoker{
        public $commandArr = array();
        public $undoCommand;
        public function __construct(){
            for($i=0;$i<=1;$i++){
                $this->commandArr[$i] = new NoCommand();
            }
            $this->undoCommand =  new NoCommand();
        }
        public function setCommand($slot,$command){
            $this->commandArr[$slot] = $command;
        }
        public function executeCommand($slot){
            $this->commandArr[$slot]->execute();
            $this->undoCommand = $this->commandArr[$slot];
        }
        public function undoCommand(){
            $this->undoCommand->undo();
        }
    }
    //客户端操作
    $invoker = new Invoker();
    $invoker->setCommand(0,new ConcreteCommand1(new Receiver1()));
    $invoker->setCommand(1,new ConcreteCommand1(new Receiver2()));
    $invoker->executeCommand(0);
    $invoker->undoCommand();
  • 相关阅读:
    Mac php使用gd库出错 Call to undefined function imagettftext()
    centos 使用 locate
    Mac HomeBrew 安装 mysql
    zsh 命令提示符 PROMPT
    新的开始
    Java 面试题分析
    Java NIO Show All Files
    正确使用 Volatile 变量
    面试题整理 2017
    有10阶梯, 每次走1,2 or 3 阶,有多少种方式???
  • 原文地址:https://www.cnblogs.com/huixuexidezhu/p/5984036.html
Copyright © 2020-2023  润新知