php实现设计模式之 命令模式

时间:2021-05-05 21:30:51
<?php
/*
* 命令模式:(行为模式)将一个请求封装成一个对象(命令封装成对象),从而可以使用不同的请求对客户参数化(客户的不同请求,调不同的封装对象),
* 对请求排序,或者记录请求日志,以及支持可取消的操作
*
1 命令接口:声明执行方法
2 发起者 : 记录、撤销请求,请求命令执行
3 接受者 : 命令的具体实现角色。
4 具体命令: 包含接受者,调用接受者执行。
*/ //具体做事情的角色,接受者
class Receiver{
public $name; public function __construct($name){
$this->name = $name; } public function action(){
echo $this->name.'跳大';
} public function action1(){
echo $this->name.'防御';
} public function action2(){
echo $this->name.'治疗';
}
} //命令接口
interface Command{
public function execute();
} //具体的三个命令,包含一个接受者,调用接受者去做
class Command1 implements Command{
public $receiver; public function __construct($receiver){
$this->receiver = $receiver;
} public function execute(){
$this->receiver->action();
}
} class Command2 implements Command{
public $receiver; public function __construct($receiver){
$this->receiver = $receiver;
} public function execute(){
$this->receiver->action1();
}
} class Command3 implements Command{
public $receiver; public function __construct($receiver){
$this->receiver = $receiver;
} public function execute(){
$this->receiver->action2();
}
} //命令发起者,记录,删除命令,请求执行命令
class Invoker{
public $command = array(); public function setCommand($command){
$this->command[] = $command;
} public function executeCommand(){//请求执行
foreach ($this->command as $key=>$value){
$value->execute();
echo "<br/>";
}
}
public function removeCommand($command){
$key = array_search($command, $this->command);
if($key!==false){
unset($this->command[$key]);
}
}
} /*
* 请求流程:先实例化接受者(具体做事的角色),然后实例化命令。
* 接着实例化一个请求者,请求者注册命令,请求执行命令
*/
$role1 = new Receiver('盖伦');
$role2 = new Receiver('皇子'); $command1 = new Command1($role2);
$command2 = new Command2($role1); $invoker = new Invoker();
$invoker->setCommand($command1);
$invoker->setCommand($command2); $invoker->executeCommand();
?>