您的位置:首页 > 其它

设计模式之行为型模式―― 3.3 命令模式

2015-02-17 20:18 183 查看
<?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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: