设计模式之命令链模式

<?php

interface ICommand
{
    public function onCommand( $name );
}
//为各个针对不同情况的函数,尽量用相同的处理函数

class CommandChain//主类
{
    private $_commands = array();//用来保存各种情况所对应的类的对象

    public function addCommand( $cmd )//增加不同的“处理器”
    {
        $this->_commands []= $cmd;
    }

    public function runCommand( $name )//主类中的处理函数
    {
        foreach( $this->_commands as $cmd )//将数组中存放的“处理器”依次调用,判断“处理器”中的方法是否相匹配,如果匹配,直接返回,不再往下执行
        {
            if ($cmd->onCommand( $name )) {
                return;
            }
        }
    }
}

class UserCommand implements ICommand//第一个处理器,判断用户名中是否含有adduser
{
    public function onCommand( $name )
    {
        if ($name != 'addUser' ) {
            return false;
        }
        echo "UserCommand handling 'addUser'\n";
        return true;
    }
}

class MailCommand implements ICommand//第二个“处理器”。用来判断name中是否有mail
{
    public function onCommand( $name )
    {
        if ($name != 'mail') {
            return false;
        }
        echo "MailCommand handling 'mail'\n";
        return true;
    }
}

$cc = new CommandChain();//定义一个主类对象
$cc->addCommand( new MailCommand() );//添加处理器
$cc->addCommand( new UserCommand() );//添加处理器
$cc->runCommand( 'addUser' );//输入参数adduser来处理
$cc->runCommand( 'mail' );
?>

  这和之前的策略模式都很像,将几个“处理器”定义为类,都有相同的一个方法。

 

1.写出几个策略类,有相同的方法(用接口实现)

2.主类有一个数组用于保存插入的不同的策略函数的对象

3.主类中用循环取出不同的策略对象,调用对象的处理方法,返回true,程序就停止运行

posted @ 2016-08-13 03:50  萝卜er  阅读(1191)  评论(1编辑  收藏  举报