注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Copper peas ' Bolg

Keep On Moving...This Is My Life...

 
 
 

日志

 
 

【原】 PHP 设计模式十三之命令设计模式  

2011-06-16 12:54:07|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

<?php
header("Content-type: text/html; charset=utf-8");
/**
 * 电子商务网购物品 命令设计模式
 * 定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
 * “行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的,命令模式即解耦。
 * 描述:顾客(执行者) 订单  验单员(调用者) 出货员(接收者)
 * 顾客陆续选中多件物品   下单记录    验单员检测单子    待顾客完全购物选定完成     才统一发送物品清单      出货员出货
 * 这里顾客是行为请求者     出货员行为实现者     每个物品的下单记录就是命令    单子就是命令集合    验单员是一个命令调用管理者(这里可以执行命令顺序 ,撤销等一系列命令操作)
 *
 * @anthor Chen Wei Han <csq-3@163.com>
 * @copyright Chen Wei Han 2011-6-16上午09:45:47
 * @link http://csq-3.blog.163.com
 * @package demo
 * @version 1.0 command.php
 */

/**
 * 网购命令集合类
 */
class Mqmqcommand
{  
 /**
  * 撤销命令
  */
 public function undo()
 {
  echo "撤销订单购买该条记录!";
 }
    /**
  * 恢复命令
  */
 public function revert()
 {
  echo "恢复订单购买该条记录!";
 }
 
    /**
  * 删除命令
  */
 public function del()
 {
  echo "删除订单购买该条记录!";
 }
 
    /**
  * 下单命令
  */
 public function downorder()
 {
  echo "增加下单记录!";
 }
}


/**
 * 抽象命令
 */
 abstract  class abstract_Command
 { 
  protected $cmdclass;
  
  public function __construct($cmdclass)
  {
   $this->cmdclass = $cmdclass;
  }
  
  abstract public function execute(); 
 }
 
 /**
  *  具体实现类撤销命令
  */
 class Undocommand extends abstract_Command
 {
  
  public function execute()
  {
   $this->cmdclass->undo();  
  }
  
 }
 
 /**
  * 具体实现类恢复命令
  */
  class Revertcommand extends abstract_Command
  {
  
  public function execute()
  {
   $this->cmdclass->revert();  
  }
  
  }
 
 /**
  * 具体实现类删除命令
  */
  class Delcommand extends abstract_Command
  {
  
  public function execute()
  {
   $this->cmdclass->del();  
  }
  
  }
 
  /**
   * 具体实现类下单命令
   */
  class Downorder extends abstract_Command
  {
   public function execute()
  {
   $this->cmdclass->downorder();  
  }
  
  }
   
  /**
   * 命令调用者
   */
 
  class Invoker
  {
   
   private $arr=array();

   /*
    * 添加订单记录
    */
   public function addcmd(abstract_Command $cmd)
   {
     $this->arr[spl_object_hash($cmd)] = $cmd;    
   }
   
   /*
    * 删除订单记录
    */
   public function remove(abstract_Command $cmd)
   {
    unset($this->arr[spl_object_hash($cmd)]);
   }
   
   /*
    * 执行命令
    */
   public function action(){
   
     foreach($this->arr as $value)
     {
      $value->execute();
     }
   }
   
   /**
    * 撤销命令 略
    */
   
   /**
    * 恢复命令 略
    */
   
  }
 
  /**
   * 客服端调用
   *
   */
  class Client
  {
   public static function main()
   {
    //命令集合类
    $mqmqcmds  = new Mqmqcommand();
    
    //命令子类,把每一个命令分解为一个对象
    $undocmd   = new Undocommand($mqmqcmds);
    $revertcmd = new Revertcommand($mqmqcmds);
    $downcmd   = new Downorder($mqmqcmds);
    $delcmd    = new Delcommand($mqmqcmds);
    
    //调用者类(请求命令参数化传递进去)
    $invoker   = new Invoker();
      
    $invoker->addcmd($undocmd);    
    $invoker->addcmd($revertcmd);
    $invoker->addcmd($delcmd);
    $invoker->addcmd($downcmd);

    //统一处理
    $invoker->action();
    
    }
  } 
 
  Client::main();
 
  /*
   * 注:看了例子估计还有很多人很茫然,感觉可以直接使用网购集合类,使用命令模式反而画蛇添足。
   * 关键理解:1.“行为请求者”与“行为实现者”的解耦,2:命令请求类化最后参数化 3:统一处理发送(可以重新排序执行等)
   * 以前的方式是无法满足变化多变的需要的(比如改变执行顺序,命名方式只需要修改调用者执行类即可,而以前的需要修改原程序的调用执行顺序方式,扩展不方便)
   * 首先解耦:以前是执行者调用类方法,知道是那个方法执行的命令 ,也就是说顾客知道是那个送货员
   * 现在,他把命令执行,调用者收到了,但具体是那个执行,他不知道,由调用者去调用,也就是说执行者和执行的类解耦了。
   * 执行者执行命令给命令执行的实现没有关系,你只管下命令,怎么去执行,你不用管,而调用者负责去传递命令给执行命令的人。
   * 如果是以前的方式,命令执行者下了命令等于是调用了执行类的一个方法,如果执行类不存在,命令就下不了,耦合,明白了吧。
   * 后面两点也不多说,自己分析了。
   */
 

  评论这张
 
阅读(75)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018