Статья
Шаблон проектирования "Мост"

Шаблон проектирования "Мост"

21 ноября 2017

Основная идея в том, чтобы отделить абстракцию от её реализации так, что они могут изменяться независимо друг от друга.

Пусть имеется интерфейс Formatter и 2 разных вида форматирования - PlainTextFormatter и HtmlFormatter:

interface Formatter
{
    public function format($text);
}

class PlainTextFormatter implements Formatter
{
    public function format($text)
    {
        return $text;
    }
}

class HtmlFormatter implements Formatter
{
    public function format($text)
    {
        return sprintf("<p>" . $text . "</p>");
    }
}

 

Также пусть имеются 2 сервиса - HelloService и GoodbyeService:

abstract class Service
{
    protected $implementation;

    public function __construct(Formatter $impl)
    {
        $this->setImplementation($impl);
    }

    public function setImplementation(Formatter $impl)
    {
        $this->implementation = $impl;
    }

    abstract public function get();
}


class HelloService extends Service
{
    public function get()
    {
        return $this->implementation->format('Hello!');
    }
}

class GoodbyeService extends Service
{
    public function get()
    {
        return $this->implementation->format('Goodbye!');
    }
}

 

Использование:

$helloService = new HelloService(new PlainTextFormatter());
$helloService->get(); // Hello!
$helloService->setImplementation(new HtmlFormatter());
$helloService->get(); // <p>Hello!</p>

$goodbyeService = new GoodbyeService(new HtmlFormatter());
$goodbyeService->get(); // <p>Goodbye!</p>
$goodbyeService->setImplementation(new PlainTextFormatter());
$goodbyeService->get(); // Goodbye!



Источники:

http://designpatternsphp.readthedocs.io/ru/latest/Structural/Bridge/README.html
https://habrahabr.ru/company/mailru/blog/325492/