zoukankan      html  css  js  c++  java
  • 设计模式学习(七)、命令模式

    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();
  • 相关阅读:
    JS中的逻辑或||逻辑与&&
    for 循环里面事件函数的i值
    getByClass--js
    ul 宽度不固定居中
    style.top style.left js
    trigger() 触发事件
    JavaScript中hasOwnProperty函数
    使用windows powershell ISE管理命令窗口,并集成git命令
    nodeJs跨域设置(express,koa2,eggJs)
    node获取本机动态IP,并对应修改相关JavaScript文件的IP地址
  • 原文地址:https://www.cnblogs.com/huixuexidezhu/p/5984036.html
Copyright © 2011-2022 走看看