web development blog

> 编程 php设计模式之命令模式

php设计模式笔记,第七个是命令模式。 命令模式定义是: 将一个请求封装为一个对象,从而使你可用 不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。

刚接触命令模式的定义,还是很难理解命令模式的概念。字面上的理解,命名模式就是一个人下命令,然后有人负责传递管理命令,同时指定谁接收命令并实现命令的请求。我们想要了解模式涉及到的角色,以及角色之间的相互关系,当我们弄清楚这个之后,在看这个定义,你就会了然了。

 

涉及的角色:

Command:命令接口,罗列命令想要实现的方法;

ConcreteCommand:具体命令,表面上实现了命令方法,其实是在创建命令的时候就绑定了一个命令的接收者,而是通过接收者来实现命令的具体操作;

Receiver:命令接收者,负责实现命令的具体操作;

Invoker:命令对象调用者,负责触发命令的执行;

Client:负责创建命令,并设置命令的接收者;

 

角色直接的关系:具体命令实现命令接口,接受者是实现命令具体操作的真实对象,命令对象调用者是管理命令对象并有促发命令执行的功能,而客户端Client就是命令的创建,也有人说是装配者。

模拟实现:“岳飞抗金,十二道金牌"的历史典故为例子。下面是演示代码:

/**
 * PHP设计模式 之 命令模式
 * @website wmhfly.com
 */

/*
 * 模拟场景
 * 岳飞抗金  【 十二道金牌】 
 */



/**
 * 命令接口
 */
interface ICmd {
	public function execute();
	public function resetInfo($info);
}

/**
 * 命令接受者
 */
class Receiver {
	/**
	 * 接收者名称
	 * @var string
	 */
	private $_name = '';
	/**
	 * 传递给接收者信息
	 * @var string
	 */
	private $_info = '';
	
	public function __construct($name,$info){
		$this->_name = $name;
		$this->_info= $info;
	}
	
	/**
	 * 改变传递给接收者信息
	 * @param string $info
	 */
	public function setInfo($info){
		$this->_info = $info;
	}
	
	/**
	 * 命令功能实现的具体过程
	 */
	public function action(){
		//do...
		echo $this->_name.':'.$this->_info;
	}
}


/**
 * 具体命令:金牌命令 
 */
class GoldMedalCmd implements ICmd {
	/**
	 * 命令的接收者
	 * @var Receiver
	 */
	private $_receiver = null;
	
	/**
	 * 构造函数,明确指定谁是接受者
	 * @param Receiver $receiver
	 */
	public function __construct($receiver){
		$this->_receiver = $receiver;
	}
	
	/**
	 * 调用接收者的方法来完成命令的具体操作
	 * @see ICmd::execute()
	 */
	public function execute(){
		$this->_receiver->action();
	}
	
	/**
	 * 重设命令信息
	 * @see ICmd::resetInfo()
	 */
	public function resetInfo($info){
		$this->_receiver->setInfo($info);
	}
}



/**
 * 调用者,相当于导火线,触发命令执行
 */
class Invoker {
	/**
	 * 具体命令
	 * @var ICmd
	 */
	private $_cmd = null;
	
	/**
	 * 设置
	 * @param Icmd $cmd
	 */
	public function setCommand($cmd){
		$this->_cmd = $cmd;
	}
	
	/**
	 * 点燃导火线,触发命令 
	 */
	public function runCommand(){
		$this->_cmd->execute();
	}
}

/**
 * 命令模式 DEMO
 */

//实例化一个接收者对象
$name = '岳飞';
$gm01 = '命你带军即刻进京,不得迟缓!见金牌如见朕面,立刻照办';
$gm02 = '第二、三、四、五、六道金牌到';
$gm03 = '再不火速返京即作叛逆论处';
$gm04 = '命你速即起身,若再迟延即是违逆圣旨,立斩不赦';

$receiver = new Receiver($name,$gm01);

//实例化一个具体金牌命令
$cmd = new GoldMedalCmd($receiver);

//实例化一个调用者,并添加一个命令对象
$invoker = new Invoker();
$invoker->setCommand($cmd);
$invoker->runCommand();

//重设金牌信息
$cmd->resetInfo($gm02);
$invoker->runCommand();

$cmd->resetInfo($gm03);
$invoker->runCommand();

$cmd->resetInfo($gm04);
$invoker->runCommand();

#输出日志
岳飞:命你带军即刻进京,不得迟缓!见金牌如见朕面,立刻照办
岳飞:第二、三、四、五、六道金牌到
岳飞:再不火速返京即作叛逆论处
岳飞:命你速即起身,若再迟延即是违逆圣旨,立斩不赦
 

命令模式演示源文件下载.

-留言评论-

  • 留言载入中...

-拍砖-

 

首页|前端技术|编程/php|生活|关于我

Copyright © 2012 wmhfly.com