2.2. Ponte (Bridge)

2.2.1. Objetivo

Desacoplar uma abstração da sua implementação de modo que as duas possam variar independentemente.

2.2.2. Diagrama UML

Alt Bridge UML Diagram

2.2.3. Código

Você também pode encontrar este código no 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. Teste

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}