PHP - паттерн Мост пример кода

Автор примера: Enrico Zimuel (enrico@zimuel.it)
Наименование участников (что значит) и описание паттерна здесь.

<?php

/* релазитор  - обобщённый*/
interface DrawingAPI {
    public function drawCircle($x, $y, $radius);
}

/*конкретный релазитор */
class DrawingAPI1 implements DrawingAPI {
    public function drawCircle($x, $y, $radius) {
        printf ("API1 draw (%d, %d, %d)\n", $x, $y, $radius); // печатаем (полезный функционал)
    }
}

/* ещё один конкретный релазитор */
class DrawingAPI2 implements DrawingAPI {
    public function drawCircle($x, $y, $radius) {
            printf ("API2 draw (%d, %d, %d)\n", $x, $y, $radius);
    }
}

// Абстракция
abstract class Shape {
    protected $api;
    protected $x;
    protected $y;
// при создании этот класс "хочет" получить ссылку на реализацию
    public function __construct(DrawingAPI $api) {
        $this->api = $api;
    }
}

/*Уточнённая абстракция - 
этот класс  как мы видим расширяет интерфейс -
есть уже конкретная функция draw() - 
да и конструктор переопределён - 
короче - "что-то добавили* =)
Но - реалазация по-прежнему держится на передаваемом 
в конструктор  DrawingAPI $api */
class CircleShape extends Shape {
    protected $radius;
    public function __construct($x, $y, $radius, DrawingAPI $api) {
        parent::__construct($api);
        $this->x = $x;
        $this->y = $y;
        $this->radius = $radius;
    }
    public function draw() {
        $this->api->drawCircle($this->x, $this->y, $this->radius);
    }
}

// Пример использования:

$shapes = array(
    new CircleShape(1, 3, 7,  new DrawingAPI1()),
    new CircleShape(5, 7, 11, new DrawingAPI2()),
);

foreach ($shapes as $sh) {
    $sh->draw();

// демонстрация процесса использования завершена =)
}