php与设计模式-命令模式

命令模式

在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式。

Demo

<?php 
   /**
    * Created by PhpStorm.
    */ 

   /**
    * 电视机是请求的接收者,
   *遥控器上有一些按钮,不同的按钮对应电视机的不同操作。
   *抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,
   *这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。
   *显然,电视机遥控器就是一个典型的命令模式应用实例。
    */ 

   /**命令接收者
    * Class Tv
    */ 
   class Tv 
   { 
       public $curr_channel=0; 

       /**
        * 打开电视机
        */ 
       public function turnOn() 
       { 
           echo "The television is on."."<br/>"; 
       } 

       /**
        * 关闭电视机
        */ 
       public function turnOff() 
       { 
           echo "The television is off."."<br/>"; 
       } 

       /**切换频道
        * @param $channel    频道
        */ 
       public function turnChannel($channel) 
       { 
           $this->curr_channel=$channel; 
           echo "This TV Channel is ".$this->curr_channel."<br/>"; 
       } 
   } 

   /**执行命令接口
    * Interface ICommand
    */ 
   interface ICommand 
   { 
       function execute(); 
   }  

   /**开机命令
    * Class CommandOn
    */ 
   class CommandOn implements  ICommand 
   { 
       private $tv; 

       public function __construct($tv) 
       { 
           $this->tv=$tv; 
       } 

       public function execute()  
       { 
           $this->tv->turnOn(); 
       } 
   } 

   /**关机命令
    * Class CommandOn
    */ 
   class CommandOff implements  ICommand 
   { 
       private $tv; 

       public function __construct($tv) 
       { 
           $this->tv=$tv; 
       } 

       public function execute() 
       { 
           $this->tv->turnOff(); 
       } 
   } 

   /**切换频道命令
    * Class CommandOn
    */ 
   class CommandChannel implements  ICommand 
   { 
       private $tv; 
       private $channel; 

       public function __construct($tv,$channel) 
       { 
           $this->tv=$tv; 
           $this->channel=$channel; 
       } 

       public function execute() 
       { 
           $this->tv->turnChannel($this->channel); 
       } 
   } 

   /**遥控器
    * Class Control
    */ 
   class Control 
   { 
       private $_onCommand; 
       private $_offCommand; 
       private $_changeChannel; 

       public function __construct($on,$off,$channel) 
       { 
           $this->_onCommand = $on; 
           $this->_offCommand = $off; 
           $this->_changeChannel = $channel; 
       } 

       public function turnOn() 
       { 
           $this->_onCommand->execute(); 
       } 

       public function  turnOff() 
       { 
           $this->_offCommand->execute(); 
       } 

       public function changeChannel() 
       { 
           $this->_changeChannel->execute(); 
       } 
   } 

//测试代码 
// 命令接收者   
$myTv = new Tv(); 
// 开机命令   
$on = new CommandOn($myTv); 
// 关机命令   
$off = new CommandOff($myTv); 

// 频道切换命令   
$channel = new CommandChannel($myTv, 2); 
// 命令控制对象  
$control = new Control($on, $off, $channel); 
// 开机   
$control->turnOn(); 
// 切换频道   
$control->changeChannel(); 
// 关机   
$control->turnOff(); 

请关注我的订阅号

订阅号.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值