PHP设计模式笔记:命令模式(comman)
命令模式:
命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
要点:
- 执行命令的操作太过复杂或者一个命令需要多个对象同时操作,才需要命令模式
- 接受者有可能有多个
- 上述定义中,执行命令的责任指命令角色,不是指接受者。
结构图:
角色:
- 命令(Command):具体命令类的抽象接口。
- 具体命令(ConcreteCommand):负责调用所有接收者共同完成请求
- 请求者(Invoker):负责调用命令对象执行请求。
- 接收者(Receiver):负责具体实施和执行一个请求。
应用场景:
- 执行命令的操作太过复杂或者一个命令需要多个对象同时操作
优点:
- 用户在使用的时候,只与该命令对象打交道,而不用与执行具体命令的对象打交道,降低了耦合性,提高了程序设计的灵活性
缺点:
- :可能会导致有过多的具体命令类。
<?php
/**
* 命令模式 2010-08-21 sz
* @author phppan
* @package design pattern
*/
/**
* 命令角色
*/
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();
?>