PHP设计模式-命令模式

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值