命令模式——智能家居来了

本文探讨如何利用命令模式在智能家居系统中实现撤销命令的功能。通过将消费者指令、智能管家和电器设备分离,使得系统能灵活添加命令并支持命令队列。文中详细介绍了命令、管理者和命令执行者的角色定义,以及客户端如何与系统交互。

俗话说说出去的话就像撒出去的水,再也收不回,可以我们总有希望收回的时候。当发现下达错误的命令操作后,能否撤销操作操作呢?答案是可以,下面我们借助命令模式来完成这个功能。

在这里我们来构建一个智能家居系统,消费者可以发送指令给智能管家,然后智能管家根据命令调用家里的各种电器完成指定操作,从而调节我们的家居环境。总体来说,命令模式总也包含三大部分,命令(消费者指令),管理者(智能管家),命令实际执行者(电器),客户端并不关心命令是由谁执行的而又管家来决定,客户端只关心操作是否成功。

首先,命令模式的一个特点就是可以灵活添加命令,能够较容易地设计一个命令队列,基于这个特点,我们定义了命令部分的相关类如下:

//抽象命令类
abstract class command{
   //命令名,用于检测命令是否被支持
   public $commandName;
   //命令接受者
   public $receiver;
   //设置命令接收者
   function setReceiver($executor){
       $this->receiver=$executor;
   }
   abstract function executeCommand();
}
//具体命令类(提高温度)
class raiseTemp extends  command {
    //初始化命令名和命令的执行者
    public function __construct($receiver)
    {   
        $this->receiver=$receiver;
        $this->commandName='raiseTemp';
    }
    //命令的执行实际上是通过调用执行者的对应方法完成的
    function executeCommand()
    {
        $this->receiver->raiseTemp();
    }
}
//具体命令类(降低温度)
class reduceTemp extends command {
    public function __construct($receiver)
    {
        $this->receiver=$receiver;
        $this->commandName='reduceTemp';
    }
    function executeCommand()
    {
        $this->receiver->reduceTemp();
    }
}
//具体命令类(开灯)
class turnOnTheLight extends command {
    public function __construct($receiver)
    {
        $this->receiver=$receiver;
        $this->commandName='turnOnTheLight';
    }
    function executeCommand()
    {
        $this->receiver->turnOn();
    }
}
//具体命令类(关灯)
class turnOffTheLight extends command {
    public function __construct($receiver)
    {
        $this->receiver=$receiver;
        $this->commandName='turnOffTheLight';
    }
    function executeCommand()
    {
        $this->receiver->turnOff();
    }
}

接下来定义命令的实际执行者:

class aircondictioner{
    function raiseTemp()
    {
        echo "提高温度<br>";
    }
    function reduceTemp()
    {
        echo "降低温度<br>";
    }
}
class light{
    function turnOn(){
        echo "开灯<br>";
    }
    function turnOff(){
        echo "关灯<br>";
    }
}

命令模式能够实现撤回或者恢复操作,允许命令接收方决定是否执行操作,能够把请求一个操作的对象和执行操作的对象分开的特点,所以我们在这里通过定义一个管理者类来体现这些特点:

class manager{
    //支持的命令集
    private $commandSet=array('raiseTemp',
                              'reduceTemp',
                              'turnOffTheLight',
                              'turnOnTheLight');
    //目前等待执行的命令队列
    private $commandList=array();
    public function addCommand(command $command){
        //判断命令是否被支持
        if(!in_array($command->commandName,$this->commandSet)){
            echo "命令不存在<br>";
            return false;
        }else{
            $this->commandList[]=$command;
            return true;
        }
    }
    //撤销操作
    public function rollBack($commandName){
        $temp=array();
        foreach ($this->commandList as $command){
             if($command->commandName!= $commandName){
                 $temp[]=$command;
             }
        }
         $this->commandList=$temp;
    }
    //执行所有等待操作的命令
    public function execute(){
        foreach ($this->commandList as $command) {
             $command->executeCommand();
        }
    }
}

下面是客户端代码:

//实例化命令实际执行者
$air=new aircondictioner();
$light=new light();
//实例化命令
$heatPlus=new raiseTemp($air);
$heatSub=new reduceTemp($air);
$lightOn=new turnOnTheLight($light);
$lightOff=new turnOffTheLight($light);
//实例化管理者
$m=new manager();
//添加命令
$m->addCommand($heatPlus);
$m->addCommand($lightOn);
$m->execute();
echo "<hr>";
//命令撤销
$m->rollBack('turnOnTheLight');
$m->execute();

显示:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值