2.2. Bridge

2.2.1. Scopo

Disaccoppiare un’astrazione dalla sua implemententazione cosi che possano variare in in maniera indipendente.

2.2.2. Diagramma UML

Alt Bridge UML Diagram

2.2.3. Codice

Potete trovare questo codice anche su 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. Test

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}