Міст

Аналогія

Допустимо, у вас є сайт з кількома сторінками. Ви бажаєте дозволити користувачам змінювати теми оформлення сторінок. Як би ви вчинили? Створили множинні копії кожної сторінки для кожної теми або просто зробили окремі теми та підвантажували їх відповідно до налаштувань користувачів? Шаблон "Міст" дозволяє реалізувати другий підхід.

bridge_1.jpg

Коротко

Шаблон "Міст" - це перевага компонування успадкування. Подробиці реалізації передаються з однієї ієрархії до іншого об'єкта з окремою ієрархією.

Вікіпедия

Шаблон «Міст» означає відокремлення абстракції від реалізації, щоб їх обидві можна було змінювати незалежно один від одного.

Приклад

Реалізуємо вищеописаний приклад із веб-сторінками. Зробимо ієрархію WebPage:

interface WebPage
{
    public function __construct(Theme $theme);
    public function getContent();
}

class About implements WebPage
{
    protected $theme;

    public function __construct(Theme $theme)
    {
        $this->theme = $theme;
    }

    public function getContent()
    {
        return "About page in " . $this->theme->getColor();
    }
}

class Careers implements WebPage
{
    protected $theme;

    public function __construct(Theme $theme)
    {
        $this->theme = $theme;
    }

    public function getContent()
    {
        return "Careers page in " . $this->theme->getColor();
    }
}

Відділимо ієрархію тем:

interface Theme
{
    public function getColor();
}

class DarkTheme implements Theme
{
    public function getColor()
    {
        return 'Dark Black';
    }
}
class LightTheme implements Theme
{
    public function getColor()
    {
        return 'Off white';
    }
}
class AquaTheme implements Theme
{
    public function getColor()
    {
        return 'Light blue';
    }
}

Обидві ієрархії:

$darkTheme = new DarkTheme();

$about = new About($darkTheme);
$careers = new Careers($darkTheme);

echo $about->getContent(); // "About page in Dark Black";
echo $careers->getContent(); // "Careers page in Dark Black";