2.2. Мост (Bridge)

2.2.1. Назначение

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

2.2.2. Диаграмма UML

Alt Bridge UML Diagram

2.2.3. Код

Вы можете найти этот код на GitHub

Formatter.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Structural\Bridge;
 6
 7interface Formatter
 8{
 9    public function format(string $text): string;
10}

PlainTextFormatter.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Structural\Bridge;
 6
 7class PlainTextFormatter implements Formatter
 8{
 9    public function format(string $text): string
10    {
11        return $text;
12    }
13}

HtmlFormatter.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Structural\Bridge;
 6
 7class HtmlFormatter implements Formatter
 8{
 9    public function format(string $text): string
10    {
11        return sprintf('<p>%s</p>', $text);
12    }
13}

Service.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Structural\Bridge;
 6
 7abstract class Service
 8{
 9    public function __construct(protected Formatter $implementation)
10    {
11    }
12
13    final public function setImplementation(Formatter $printer)
14    {
15        $this->implementation = $printer;
16    }
17
18    abstract public function get(): string;
19}

HelloWorldService.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Structural\Bridge;
 6
 7class HelloWorldService extends Service
 8{
 9    public function get(): string
10    {
11        return $this->implementation->format('Hello World');
12    }
13}

PingService.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Structural\Bridge;
 6
 7class PingService extends Service
 8{
 9    public function get(): string
10    {
11        return $this->implementation->format('pong');
12    }
13}

2.2.4. Тест

Tests/BridgeTest.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Structural\Bridge\Tests;
 6
 7use DesignPatterns\Structural\Bridge\HelloWorldService;
 8use DesignPatterns\Structural\Bridge\HtmlFormatter;
 9use DesignPatterns\Structural\Bridge\PlainTextFormatter;
10use PHPUnit\Framework\TestCase;
11
12class BridgeTest extends TestCase
13{
14    public function testCanPrintUsingThePlainTextFormatter()
15    {
16        $service = new HelloWorldService(new PlainTextFormatter());
17
18        $this->assertSame('Hello World', $service->get());
19    }
20
21    public function testCanPrintUsingTheHtmlFormatter()
22    {
23        $service = new HelloWorldService(new HtmlFormatter());
24
25        $this->assertSame('<p>Hello World</p>', $service->get());
26    }
27}