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();
  • 相关阅读:
    2020年秋招联发科小米等20家公司面经总结
    一个普通硕士生的2020秋招总结(文末送福利)
    Linux内核中container_of宏的详细解释
    拒绝造轮子!如何移植并使用Linux内核的通用链表(附完整代码实现)
    UWB硬件设计相关内容
    SpringToolSuit(STS)添加了Lombok后仍然报错
    Spring Boot整合Mybatis出现错误java.lang.IllegalStateException: Cannot load driver class:com.mysql.cj.jdbc.Driver
    Word快捷选取
    微服务下的用户登录权限校验解决方案
    Spring Boot 使用Mybatis注解开发增删改查
  • 原文地址:https://www.cnblogs.com/huixuexidezhu/p/5984036.html
Copyright © 2011-2022 走看看