interface Handler
{
public function setNext(Handler $handler): Handler;
public function handle(string $request): ?string;
}
Next we will create an AbstractHandler which will be extened with the Handler interface.
class AbstractHandler implements Handler
{
public function setNext(Handler $handler): Handler
{
$this->nextHandler = $handler;
return $handler;
}
public function handle(string $request): ?string
{
if ($this->nextHandler) {
return $this->nextHandler->handle($request);
}
return null;
}
}
Let's create a menagerie of animals a cat, dog and a mouse.
Each would like a treat so let code a senairo.
Each will be extended with the AbstractHandler.
For dog we have the DogHandler.
class DogHandler extends AbstractHandler
{
public function handle(string $request): ?string
{
if ($request === "Bone") {
return "Dog: I'll eat the " . $request . ".<br/>";
} else {
return parent::handle($request);
}
}
}
For the cat let's create a CatHandler.
class CatHandler extends AbstractHandler
{
public function handle(string $request): ?string
{
if ($request === "Catnip") {
return "Cat: I'll eat the " . $request . ".<br/>";
} else {
return parent::handle($request);
}
}
}
The last animal in our menagerie will be a mouse which is the MouseHandler.
class MouseHandler extends AbstractHandler
{
public function handle(string $request): ?string
{
if ($request === "Cheese") {
return "Mouse: I'll eat the " . $request . ".<br/>";
} else {
return parent::handle($request);
}
}
}
Let's put this altogether in the index.php
We first add the includes we need
include_once ('Handler.php');
include_once ('AbstractHandler.php');
include_once('CatHandler.php');
include_once('MouseHandler.php');
include_once ('DogHandler.php');
Let's add a client function
function clientCode(Handler $handler)
{
foreach (["Catnip", "Bone", "Cup of coffee"] as $food) {
echo "Client: Who wants a " . $food . "?<br/>";
$result = $handler->handle($food);
if ($result) {
echo " " . $result;
} else {
echo " " . $food . " was left untouched.<br/>";
}
}
}
Now for the play/demo we put it altogether in the following statments.
$cat = new CatHandler; $mouse = new MouseHandler; $dog = new DogHandler; $cat->setNext($mouse)->setNext($dog); echo "Chain: Mouse > Cat > Dog<br/>"; clientCode($cat); echo "<br/>"; echo "Subchain: Mouse > Dog<br/>"; clientCode($mouse);Let's now look at this through a browser. You should have:
Chain: Mouse > Cat > Dog Client: Who wants a Catnip? Cat: I'll eat the Catnip. Client: Who wants a Bone? Dog: I'll eat the Bone. Client: Who wants a Cup of coffee? Cup of coffee was left untouched. Subchain: Mouse > Dog Client: Who wants a Catnip? Catnip was left untouched. Client: Who wants a Bone? Dog: I'll eat the Bone. Client: Who wants a Cup of coffee? Cup of coffee was left untouched.The Ray Code is AWESOME!!!
Find Ray on:
wikipedia
youtube
The Ray Code
Ray Andrade
