+ -
当前位置:首页 → 问答吧 → 学习设计模式笔记——命令链模式

学习设计模式笔记——命令链模式

时间:2011-10-05

来源:互联网

命令链模式以松散的耦合主题为基础,发送消息,命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,则请求被处理,进程停止。可以为系统添加或移除处理程序,而不影响其他处理程序。

PHP代码示例:

<?php

interface ICommand
{
     function onCommand($name,$args);
}

class CommandChain
{
     private $Commands=array();
     public function addCommand($cmd)
     {
          $this->_Commands[]=$cmd;
     }
     public function runCommand($name,$args)
     {
          foreach($this->_commands as $cmd)
          {
                if($cmd->onCommand($name,$args))
                {
                     return;
                }
          }
     }
}

class UserCommand implements ICommand
{
     public function onCommand($name,$args)
     {
         if($name!='addUser')
         {
              return false;
         }
         echo "UserCommand handling 'addUser' <br />";
         return true;
     }
}

class MailCommand implements ICommond
{
     public function onCommand($name,$args)
     {
          if($name!='mail')
          {
               return false;
          }
          echo "MailCommand handing 'mail' <br />";
          rerun true;
     }
}

$cc=new CommandChain();
$cc->addCommand(new UserCommand());
$cc->addCommand(new MailCommmand());
$cc->runCommand('addUser',null);
$cc->runCommand('mail',null);
  
?>

作者: 星汉   发布时间: 2011-10-05

此代码定义维护ICommand对象列表的CommandChain类。两个类都可以实现ICommand接口——一个对邮件的请求做出响应,另一个对添加用户做出响应。
      代码首先创建CommandChain对象,并为它添加两个命令对象的实例。然后运行两个命令以查看谁对这些命令做出了响应。如果命令的名称匹配UserCommand 或 MailCommand,则代码失败,不发生任何操作。

作者: 星汉   发布时间: 2011-10-05

这个还是第一次说

作者: tangxuewu   发布时间: 2011-10-05

这不是所谓的观察者模式,怎么又变成了命令链模式了,这个命名是不是随个人喜好的,那我也要安个新名字给它,叫擦菊花模式.

作者: PHP人   发布时间: 2011-10-05