PHP - паттерн Мост пример кода
Primary tabs
Автор примера: 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();
// демонстрация процесса использования завершена =)
}- Log in to post comments
- 4145 reads