设计模式学习命令模式

Posted 会学习的猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式学习命令模式相关的知识,希望对你有一定的参考价值。

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();

 

以上是关于设计模式学习命令模式的主要内容,如果未能解决你的问题,请参考以下文章

学习设计模式之命令模式

是否有在单个活动中处理多个片段的 Android 设计模式?

尝试使用片段保存夜间模式状态

设计模式学习笔记--命令模式

Sublime text3最全快捷键清单

如何运用领域驱动设计 - 值对象