解耦一個對象使抽象與實現分離,這樣二者能夠獨立地變化。php
<?php namespace DesignPatterns\Structural\Bridge; /** * 建立格式化接口。 */ interface FormatterInterface { public function format(string $text); }
<?php namespace DesignPatterns\Structural\Bridge; /** * 建立 PlainTextFormatter 文本格式類實現 FormatterInterface 接口。 */ class PlainTextFormatter implements FormatterInterface { /** * 返回字符串格式。 */ public function format(string $text) { return $text; } }
<?php namespace DesignPatterns\Structural\Bridge; /** * 建立 HtmlFormatter HTML 格式類實現 FormatterInterface 接口。 */ class HtmlFormatter implements FormatterInterface { /** * 返回 HTML 格式。 */ public function format(string $text) { return sprintf('<p>%s</p>', $text); } }
<?php namespace DesignPatterns\Structural\Bridge; /** * 建立抽象類 Service。 */ abstract class Service { /** * @var FormatterInterface * 定義實現屬性。 */ protected $implementation; /** * @param FormatterInterface $printer * 傳入 FormatterInterface 實現類對象。 */ public function __construct(FormatterInterface $printer) { $this->implementation = $printer; } /** * @param FormatterInterface $printer * 和構造方法的做用相同。 */ public function setImplementation(FormatterInterface $printer) { $this->implementation = $printer; } /** * 建立抽象方法 get() 。 */ abstract public function get(); }
<?php namespace DesignPatterns\Structural\Bridge; /** * 建立 Service 子類 HelloWorldService 。 */ class HelloWorldService extends Service { /** * 定義抽象方法 get() 。 * 根據傳入的格式類定義來格式化輸出 'Hello World' 。 */ public function get() { return $this->implementation->format('Hello World'); } }
<?php namespace DesignPatterns\Structural\Bridge\Tests; use DesignPatterns\Structural\Bridge\HelloWorldService; use DesignPatterns\Structural\Bridge\HtmlFormatter; use DesignPatterns\Structural\Bridge\PlainTextFormatter; use PHPUnit\Framework\TestCase; /** * 建立自動化測試單元 BridgeTest 。 */ class BridgeTest extends TestCase { /** * 使用 HelloWorldService 分別測試文本格式實現類和 HTML 格式實 * 現類。 */ public function testCanPrintUsingThePlainTextPrinter() { $service = new HelloWorldService(new PlainTextFormatter()); $this->assertEquals('Hello World', $service->get()); // 如今更改實現方法爲使用 HTML 格式器。 $service->setImplementation(new HtmlFormatter()); $this->assertEquals('<p>Hello World</p>', $service->get()); } }
PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)sql
面試10家公司,收穫9個offer,2020年PHP 面試問題shell
★若是喜歡個人文章,想與更多資深開發者一塊兒交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入咱們的羣啊,暗號:phpzh(羣號碼856460874)。設計模式
內容不錯的話但願你們支持鼓勵下點個贊/喜歡,歡迎一塊兒來交流;另外若是有什麼問題 建議 想看的內容能夠在評論提出架構