« Patrons de conception/Visiteur » : différence entre les versions

Contenu supprimé Contenu ajouté
m Formatage, ajout de code
→‎PHP : example
Ligne 194 :
}
}
</source>[[Programmation PHP|PHP]]<source lang="php">
<?php
interface CarElement
{
public function accept(CarElementVisitor $visitor);
}
 
interface CarElementVisitor
{
public function visit(CarElement $carElement);
}
 
class Body implements CarElement
{
public function accept(CarElementVisitor $visitor)
{
$visitor->visit($this);
}
}
 
class Engine implements CarElement
{
public function accept(CarElementVisitor $visitor)
{
$visitor->visit($this);
}
}
 
class Wheel implements CarElement
{
private $name;
 
public function __construct(String $name)
{
$this->name = $name;
}
 
public function getName()
{
return $this->name;
}
 
public function accept(CarElementVisitor $visitor)
{
$visitor->visit($this);
}
}
 
class Car
{
private $elements;
 
public function __construct()
{
$this->elements = [
new Wheel("front left"),
new Wheel("front right"),
new Wheel("back left"),
new Wheel("back right"),
new Body(),
new Engine()
];
}
 
public function getElements()
{
return $this->elements; // Retourne une copie du tableau de références.
}
}
 
class CarElementDoVisitor implements CarElementVisitor
{
public function visit(CarElement $carElement)
{
if ($carElement instanceof Wheel) {
echo "Kicking my " . $carElement->getName() . "<br>";
}
 
if ($carElement instanceof Engine) {
echo "Starting my engine<br>";
}
 
if ($carElement instanceof Body) {
echo "Moving my body<br>";
}
}
 
public function visitCar(Car $car)
{
echo "<br>Starting my car<br>";
 
foreach ( $car->getElements() as $carElement ) {
$carElement->accept($this);
}
 
echo "Started car<br>";
}
}
 
class CarElementPrintVisitor implements CarElementVisitor
{
public function visit(CarElement $carElement)
{
if ($carElement instanceof Wheel) {
echo "Visiting " . $carElement->getName() . "wheel<br>";
}
 
if ($carElement instanceof Engine) {
echo "Visiting engine<br>";
}
 
if ($carElement instanceof Body) {
echo "Visiting body<br>";
}
}
 
public function visitCar(Car $car)
{
echo "Visiting car<br>";
 
$elements = $car->getElements();
foreach ( $elements as $element) {
$element->accept($this);
}
 
echo "Visited car<br>";
}
}
 
$car = new Car();
$printVisitor = new CarElementPrintVisitor();
$doVisitor = new CarElementDoVisitor();
$printVisitor->visitCar($car);
$doVisitor->visitCar($car);
 
 
 
 
</source>