桥梁模式(Bridge)

目的

将抽象与实现分离,这样两者可以独立地改变。

例子

UML 图

file

代码

你也可以在 GitHub 上查看代码

FormatterInterface.php

  1. <?php
  2. namespace DesignPatterns\Structural\Bridge;
  3. /**
  4. * 创建格式化接口。
  5. */
  6. interface FormatterInterface
  7. {
  8. public function format(string $text);
  9. }

PlainTextFormatter.php

  1. <?php
  2. namespace DesignPatterns\Structural\Bridge;
  3. /**
  4. * 创建 PlainTextFormatter 文本格式类实现 FormatterInterface 接口。
  5. */
  6. class PlainTextFormatter implements FormatterInterface
  7. {
  8. /**
  9. * 返回字符串格式。
  10. */
  11. public function format(string $text)
  12. {
  13. return $text;
  14. }
  15. }

HtmlFormatter.php

  1. <?php
  2. namespace DesignPatterns\Structural\Bridge;
  3. /**
  4. * 创建 HtmlFormatter HTML 格式类实现 FormatterInterface 接口。
  5. */
  6. class HtmlFormatter implements FormatterInterface
  7. {
  8. /**
  9. * 返回 HTML 格式。
  10. */
  11. public function format(string $text)
  12. {
  13. return sprintf('<p>%s</p>', $text);
  14. }
  15. }

Service.php

  1. <?php
  2. namespace DesignPatterns\Structural\Bridge;
  3. /**
  4. * 创建抽象类 Service。
  5. */
  6. abstract class Service
  7. {
  8. /**
  9. * @var FormatterInterface
  10. * 定义实现属性。
  11. */
  12. protected $implementation;
  13. /**
  14. * @param FormatterInterface $printer
  15. * 传入 FormatterInterface 实现类对象。
  16. */
  17. public function __construct(FormatterInterface $printer)
  18. {
  19. $this->implementation = $printer;
  20. }
  21. /**
  22. * @param FormatterInterface $printer
  23. * 和构造方法的作用相同。
  24. */
  25. public function setImplementation(FormatterInterface $printer)
  26. {
  27. $this->implementation = $printer;
  28. }
  29. /**
  30. * 创建抽象方法 get() 。
  31. */
  32. abstract public function get();
  33. }

HelloWorldService.php

  1. <?php
  2. namespace DesignPatterns\Structural\Bridge;
  3. /**
  4. * 创建 Service 子类 HelloWorldService 。
  5. */
  6. class HelloWorldService extends Service
  7. {
  8. /**
  9. * 定义抽象方法 get() 。
  10. * 根据传入的格式类定义来格式化输出 'Hello World' 。
  11. */
  12. public function get()
  13. {
  14. return $this->implementation->format('Hello World');
  15. }
  16. }

测试

Tests/BridgeTest.php

  1. <?php
  2. namespace DesignPatterns\Structural\Bridge\Tests;
  3. use DesignPatterns\Structural\Bridge\HelloWorldService;
  4. use DesignPatterns\Structural\Bridge\HtmlFormatter;
  5. use DesignPatterns\Structural\Bridge\PlainTextFormatter;
  6. use PHPUnit\Framework\TestCase;
  7. /**
  8. * 创建自动化测试单元 BridgeTest 。
  9. */
  10. class BridgeTest extends TestCase
  11. {
  12. /**
  13. * 使用 HelloWorldService 分别测试文本格式实现类和 HTML 格式实
  14. * 现类。
  15. */
  16. public function testCanPrintUsingThePlainTextPrinter()
  17. {
  18. $service = new HelloWorldService(new PlainTextFormatter());
  19. $this->assertEquals('Hello World', $service->get());
  20. // 现在更改实现方法为使用 HTML 格式器。
  21. $service->setImplementation(new HtmlFormatter());
  22. $this->assertEquals('<p>Hello World</p>', $service->get());
  23. }
  24. }