俗话说说出去的话就像撒出去的水,再也收不回,可以我们总有希望收回的时候。当发现下达错误的命令操作后,能否撤销操作操作呢?答案是可以,下面我们借助命令模式来完成这个功能。
在这里我们来构建一个智能家居系统,消费者可以发送指令给智能管家,然后智能管家根据命令调用家里的各种电器完成指定操作,从而调节我们的家居环境。总体来说,命令模式总也包含三大部分,命令(消费者指令),管理者(智能管家),命令实际执行者(电器),客户端并不关心命令是由谁执行的而又管家来决定,客户端只关心操作是否成功。
首先,命令模式的一个特点就是可以灵活添加命令,能够较容易地设计一个命令队列,基于这个特点,我们定义了命令部分的相关类如下:
//抽象命令类
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();
显示:
本文探讨如何利用命令模式在智能家居系统中实现撤销命令的功能。通过将消费者指令、智能管家和电器设备分离,使得系统能灵活添加命令并支持命令队列。文中详细介绍了命令、管理者和命令执行者的角色定义,以及客户端如何与系统交互。
1665

被折叠的 条评论
为什么被折叠?



