PHP设计模式-命令模式

来源:互联网 发布:五星软件 编辑:程序博客网 时间:2024/05/02 21:10

        古代的皇帝是最喜欢下达命令的人。如果皇帝每次下达命令时都要把大家叫到面前来,会很累的。于是让太监当跑腿的。那就是太监直接与接受命令的人打交道了。皇帝让给兵部命令让派兵,让御善房做点好吃的。那么就得有三个对象,一个兵部(Military),一个御善房(就叫厨房kitchen吧),一个太监.兵部能派兵,御善房能做好吃的,太监能传达命令。

class Military {public function battle(){echo "派兵打仗".PHP_EOL;}}class Kitchen {public function cook(){echo "做好吃的".PHP_EOL;}}class Taijian {public function sendCommand(){$military = new Military();$military->battle();$kitchen = new Kitchen();$kitchen->cook();}}
       太监每次都要找到相应的部门,传达命令让它干活。太监只需要知道,这些部门都只会服从命令。那我们稍改一下,建立一个Command接口,让这些部门都必须实现它。这样,太监不管到什么部门,直接下令让他们干活就可以了。同事,把各种可能的命令抽象出来。让它相应的对象去执行相应的命令。

class Military {public function battle(){echo "派兵打仗".PHP_EOL;}}class Kitchen {public function cook(){echo "做好吃的".PHP_EOL;}}interface Command {public function execute();}class BattleCommand implements Command {protected $_military;public function __construct(Military $military){$this->_military = $military;}public function execute(){$this->_military->battle();}}class CookCommand implements Command {protected $_kitchen;public function __construct(Kitchen $kitchen){$this->_kitchen = $kitchen;}public function execute(){$this->_kitchen->cook();}}
  接下来,我们看下太监能干什么?他只需要知道是什么命令,去传就可以了。

class Taijian {protected $_command;//什么命令?public function __construct(Command $command){$this->_command = $command;}//发送命令。public function sendCommand(){$this->_command->execute();}}class King {public function do(){//让一个太监给兵部发送派兵打仗的命令。$tj1 = new Taijian(new BattleCommand(new Military()));$tj1->sendCommand();//让一个太监给御善房发送做饭的命令$tj2 = new Taijian(new CookCommand(new Kitchen()));$tj2->sendCommand();}}$king = new King();$king->do();
        这就是一个典型的命令模式。需求方不需要知道工作的细节,只管发送什么样的类型的命令,其它的事儿都交给跑腿的去做。然后跑腿的根据不的命令向不同的人发送指令。并不关心具体如何实施的。而且我们发现,在这个模式中,我们把各种命令抽象出来了,这样就让命令的发送者有了发送命令的可能。命令的具体实施由命令本身实现,发送者和传递者都无需关心。这是命令模式的关键。

0 0