Kullanılan sınıfların bağımsız olarak değişebilmesi için, bir soyutlanımı (abstraction), onun uygulanımından (implementation) ayırarak kullanılır.
Örneğe ait kodlar;
<?php // Formatter.php declare(strict_types=1); namespace DesignPatterns\Structural\Bridge; interface Formatter { public function format(string $text): string; } // PlainTextFormatter.php declare(strict_types=1); namespace DesignPatterns\Structural\Bridge; class PlainTextFormatter implements Formatter { public function format(string $text): string { return $text; } } // HtmlFormatter.php <?php declare(strict_types=1); namespace DesignPatterns\Structural\Bridge; class HtmlFormatter implements Formatter { public function format(string $text): string { return sprintf('<p>%s</p>', $text); } } // Service.php declare(strict_types=1); namespace DesignPatterns\Structural\Bridge; abstract class Service { public function __construct(protected Formatter $implementation) { } public function setImplementation(Formatter $printer) { $this->implementation = $printer; } abstract public function get(): string; } // HelloWorldService.php declare(strict_types=1); namespace DesignPatterns\Structural\Bridge; class HelloWorldService extends Service { public function get(): string { return $this->implementation->format('Hello World'); } } // PingService.php declare(strict_types=1); namespace DesignPatterns\Structural\Bridge; class PingService extends Service { public function get(): string { return $this->implementation->format('pong'); } }
Test İşlemi şu şekilde olacaktır;
<?php // Tests/BridgeTest.php declare(strict_types=1); namespace DesignPatterns\Structural\Bridge\Tests; use DesignPatterns\Structural\Bridge\HelloWorldService; use DesignPatterns\Structural\Bridge\HtmlFormatter; use DesignPatterns\Structural\Bridge\PlainTextFormatter; use PHPUnit\Framework\TestCase; class BridgeTest extends TestCase { public function testCanPrintUsingThePlainTextFormatter() { $service = new HelloWorldService(new PlainTextFormatter()); $this->assertSame('Hello World', $service->get()); } public function testCanPrintUsingTheHtmlFormatter() { $service = new HelloWorldService(new HtmlFormatter()); $this->assertSame('<p>Hello World</p>', $service->get()); } }
İlk Yorumu Siz Yapın