Chain.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'\n" ); return true; } } class MailCommand implements ICommand { public function onCommand($name, $args) { if ($name != 'mail') return false; echo( "MailCommand handling 'mail'\n" ); return true; } } $cc = new CommandChain(); $cc->addCommand( new UserCommand() ); $cc->addCommand( new MailCommand() ); $cc->runCommand( 'addUser', null ); $cc->runCommand( 'mail', null ); ?>
This code defines a
CommandChain
class that maintains a list of ICommand
objects. Two classes implement the ICommand
interface -- one that responds to requests for mail and another that responds to adding users. The UML is shown in the figure.