
三、命令模式中主要角色
命令(Command)角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色。
具体命令(ConcreteCommand)角色:定义一个接受者和行为之间的弱耦合;实现Execute()方法,负责调用接收考的相应操作。Execute()方法通常叫做执行方法。
客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。
请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
四、命令模式的优点
命令模式的优点:
1、命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分离开。
2、命令类与其他任何别的类一样,可以修改和推广。
3、可以把命令对象聚合在一起,合成为合成命令。
4、可以很容易的加入新的命令类。
命令模式的缺点:可能会导致某些系统有过多的具体命令类。
五、命令模式适用场景
1、抽象出待执行的动作以参数化对象。Command模式是回调机制的一个面向对象的替代品。
2、在不同的时刻指定、排列和执行请求。
3、支持取消操作。
4、支持修改日志。
5、用构建在原语操作上的高层操作构造一个系统。Command模式提供了对事务进行建模的方法。Command有一个公共的接口,使得你可以用同一种方式调用所有的事务。同时使用该模式也易于添加新事务以扩展系统。
六、命令模式与其它模式
合成模式(composite模式):Composite模式可被实现宏命令
原型模式(prototype模式):如果命令类带有clone(或在之前的文章中提到的copy方法)方法,命令就可以被复制。在命令模式支持多次取消操作时可能需要用到此模式,以复制当前状态的Command对象
七、命令模式PHP示例
<?php/** * 命令角色 */interface Command { /** * 执行方法 */public function execute();} /** * 具体命令角色 */class ConcreteCommand implements Command { private $_receiver; public function __construct(Receiver $receiver) {$this->_receiver = $receiver;} /** * 执行方法 */public function execute() {$this->_receiver->action();}} /** * 接收者角色 */class Receiver { /* 接收者名称 */private $_name; public function __construct($name) {$this->_name = $name;} /** * 行动方法 */public function action() {echo $this->_name, " do action.<br />";}} /** * 请求者角色 */class Invoker { private $_command; public function __construct(Command $command) {$this->_command = $command;} public function action() {$this->_command->execute();}} /** * 客户端 */class Client {/** * Main program. */public static function main() {$receiver = new Receiver("phpppan");$command = new ConcreteCommand($receiver);$invoker = new Invoker($command);$invoker->action();}} Client::main(); ?><?php/** * 命令角色 */interface Command { /** * 执行方法 */public function execute();} /** * 宏命令接口 */interface MacroCommand extends Command { /** * 宏命令聚集的管理方法,可以删除一个成员命令 * @param Command $command */public function remove(Command $command); /** * 宏命令聚集的管理方法,可以增加一个成员命令 * @param Command $command */public function add(Command $command); }class DemoMacroCommand implements MacroCommand { private $_commandList; public function __construct() {$this->_commandList = array();} public function remove(Command $command) {$key = array_search($command, $this->_commandList);if ($key === FALSE) {return FALSE;} unset($this->_commandList[$key]);return TRUE;} public function add(Command $command) {return array_push($this->_commandList, $command);} public function execute() {foreach ($this->_commandList as $command) {$command->execute();} } } /** * 具体拷贝命令角色 */class CopyCommand implements Command { private $_receiver; public function __construct(Receiver $receiver) {$this->_receiver = $receiver;} /** * 执行方法 */public function execute() {$this->_receiver->copy();}} /** * 具体拷贝命令角色 */class PasteCommand implements Command { private $_receiver; public function __construct(Receiver $receiver) {$this->_receiver = $receiver;} /** * 执行方法 */public function execute() {$this->_receiver->paste();}} /** * 接收者角色 */class Receiver { /* 接收者名称 */private $_name; public function __construct($name) {$this->_name = $name;} /** * 复制方法 */public function copy() {echo $this->_name, " do copy action.<br />";} /** * 粘贴方法 */public function paste() {echo $this->_name, " do paste action.<br />";}} /** * 请求者角色 */class Invoker { private $_command; public function __construct(Command $command) {$this->_command = $command;} public function action() {$this->_command->execute();}} /** * 客户端 */class Client {/** * Main program. */public static function main() {$receiver = new Receiver("phpppan");$pasteCommand = new PasteCommand($receiver);$copyCommand = new CopyCommand($receiver); $macroCommand = new DemoMacroCommand();$macroCommand->add($copyCommand);$macroCommand->add($pasteCommand); $invoker = new Invoker($macroCommand);$invoker->action(); $macroCommand->remove($copyCommand);$invoker = new Invoker($macroCommand);$invoker->action();}} Client::main();?>以上就是使用php实现命令模式的代码,还有一些关于命令模式的概念区分,希望对大家的学习有所帮助。