标签:设计模式 命令模式
<?php
/**
* 3.3 命令模式
* 定义:
* 讲一个请求封装为一个对象,从而是你可用不同的请求对客
* 户进行参数化;对请求排队或记录日志,以及支持可撤销的
* 操作。
* 角色:
* 1. 抽象Command类
* 职责:用来声明执行操作的接口。
* 2. 具体Command类
* 职责:将一个接收者对象绑定于一个动作,调用接收者
* 相应的操作,以实现Execute。
* 3. Invoker类
* 职责:要求该命令执行这个请求。
* 4. Receiver类
* 职责:知道如何实施与执行一个与请求相关的操作,任
* 何类都可能作为一个接受者。
* 优点:
* 1. 它能较容易地设计一个命令队列;
* 2. 在需要的情况下,可以较容易地将命令记入日志;
* 3. 允许接收请求的一方决定是否要否决请求;
* 4. 可以容易的实现对请求的撤销和重做;
* 5. 因为加进新的具体命令类不影响其他的类,因此增加新
* 的具体命令类很容易;
* 6. 把请求一个操作的对象与知道怎么执行一个操作的对象
* 分隔开。
* 缺点:
* 1. 有可能会导致某些系统有过多的具体命令类。因为针对
* 每一个命令都需要设计一个具体命令类,因此某些系统
* 需要大量具体命令类,这将影响命令模式的使用。
* 使用场景:
* 1. 系统需要将请求调用者和请求接收者解耦,使得调用者
* 和接收者不直接交互。
* 2. 系统需要在不同的时间指定请求、将请求排队和执行请
* 求。
* 3. 系统需要支持命令的撤销操作和恢复操作。
* 4. 系统需要将一组操作组合在一起,即支持宏命令。
*
*/
header(‘content-type:text/html;charset=utf8‘);
//抽象Command类
abstract class Command{
protected $receiver;
public function __construct($receiver){
$this->receiver=$receiver;
}
abstract public function execute();
}
//具体Command类
class ConcreteCommand extends Command{
public function execute(){
$this->receiver->action();
}
}
//Invoker类
//此类是用来接收来自客户端的请求,然后将请求转化为命令的执行
//命令执行的动作,最后是由最终的接受者来处理的。
class Invoker{
private $cmd;
public function setCommand(Command $cmd){
$this->cmd=$cmd;
}
public function executeCommand(){
$this->cmd->execute();
}
}
//Receiver类
class Receiver{
public function action(){
echo ‘执行请求‘;
}
}
//客户端
//请求命令的发起者
$invoker=new Invoker();
//请求命令的最终执行者
$receiver=new Receiver();
//具体的请求
$cmd=new ConcreteCommand($receiver);
//表示要设置并执行哪个请求(命令)
$invoker->setCommand($cmd);
$invoker->executeCommand();本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614785
标签:设计模式 命令模式
原文地址:http://noican.blog.51cto.com/4081966/1614785