古代的皇帝是最喜欢下达命令的人。如果皇帝每次下达命令时都要把大家叫到面前来,会很累的。于是让太监当跑腿的。那就是太监直接与接受命令的人打交道了。皇帝让给兵部命令让派兵,让御善房做点好吃的。那么就得有三个对象,一个兵部(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();
这就是一个典型的命令模式。需求方不需要知道工作的细节,只管发送什么样的类型的命令,其它的事儿都交给跑腿的去做。然后跑腿的根据不的命令向不同的人发送指令。并不关心具体如何实施的。而且我们发现,在这个模式中,我们把各种命令抽象出来了,这样就让命令的发送者有了发送命令的可能。命令的具体实施由命令本身实现,发送者和传递者都无需关心。这是命令模式的关键。