设计模式学习笔记-命令模式

我对命令模式的理解是用一个命令对象(Command),包装一个真正需要执行的对象 X(X代表不同对象),而对于要执行X对象的Invoker对象来说。它不关X对象是谁,继承了谁,也不关心要执行这个X对象中的那些方法,因为对象X千万个,方法更是千万个,Invoker关心不过来。所以Invoker想了一个办法,我只接收Command对象,并且执行Command对象中的特定的方法execute。那么想让Invoker调用,X对象就必须把自己包装成Command对象,然后在execute方法中执行想要执行的方法。

代码实现:

class CommandReceiver {
	public function actionA(){
		echo "<br>A action<br>";
	}
	public function actionB(){
		echo "<br>B action<br>";
	}
	public function actionC(){
		echo "<br>C action<br>";
	}

}

//命令封装
interface Command{
	public function execute();
}


class CommandA implements Command {
	private $_obj;
	public function __construct($obj){
		$this->_obj = $obj;
	}
	public function execute(){
		$this->_obj->actionA();
	}
}

class CommandB implements Command {
	private $_obj;
	public function __construct($obj){
		$this->_obj = $obj;
	}
	public function execute(){
		$this->_obj->actionB();
	}
}
class CommandC implements Command {
	private $_obj;
	public function __construct($obj){
		$this->_obj = $obj;
	}
	public function execute(){
		$this->_obj->actionC();
	}
}

//命令调用者

class Invoker{
	public function execute (Command $command){
		$command->execute();
	}
}

$Receiver = new CommandReceiver(); //命令的具体执行者,不一定是单个具体实例,可以是多个,根据具体情况实现命令封装即可
$A = new CommandA($Receiver);
$B = new CommandB($Receiver);
$C = new CommandC($Receiver);

$Invoker = new Invoker();
$Invoker->execute($A);
$Invoker->execute($B);
$Invoker->execute($C);

总结

将动作和接收者包进一个对象中,这个对象只暴露一个execute()方法。当此方法被调用时,接受者就会进行这些动作。从外面来看,其他对象不知道究竟哪个接收者进行了那些动作,只知道调用execute()方法就能达到目的

猜你喜欢

转载自blog.csdn.net/H_L_S/article/details/88071770
今日推荐