设计模式 - 结构 - 适配器模式

适配器模式

  • 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

      // Book.php
      namespace Structural\Adapter;
    
      interface Book
      {
          public function turnPage();
          public function open();
          public function getPage(): int;
      }
    
      // Ebook.php
      namespace Structural\Adapter;
    
      interface Ebook
      {
          public function unlock();
          public function pressNext();
          public function getPage(): array;
      }
      // Kindle.php
      namespace Structural\Adapter;
    
      class Kindle implements Ebook
      {
          private int $page = 1;
          private int $totalPage = 100;
          public function pressNext()
          {
              $this->page++;
          }
          public function unlock()
          {
    
          }
          public function getPage(): array
          {
              return [$this->page, $this->totalPage];
          }
      }
    
      // PaperBook.php
      namespace Structural\Adapter;
    
      class PaperBook implements Book
      {
          private int $page;
          public function turnPage()
          {
              $this->page++;
          }
          public function open()
          {
              $this->page = 1;
          }
          public function getPage(): int
          {
              return $this->page;
          }
      }
      // EbookAdapter.php
      namespace Structural\Adapter;
    
      class EbookAdapter implements Book
      {
          protected Ebook $ebook;
          public function __construct(Ebook $ebook)
          {
              $this->ebook = $ebook;
          }
          public function turnPage()
          {
              $this->ebook->pressNext();
          }
          public function open()
          {
              $this->ebook->unlock();
          }
          public function getPage(): int
          {
              return $this->ebook->getPage()[0];
          }
      }
      // AdapterTest.php
      namespace Tests;
    
      use PHPUnit\Framework\TestCase;
      use Structural\Adapter\EbookAdapter;
      use Structural\Adapter\Kindle;
      use Structural\Adapter\PaperBook;
    
      class AdapterTest extends TestCase
      {
          public function testAp()
          {
              $book = new PaperBook();
              $book->open();
              $book->turnPage();
              $book->getPage();
              $this->assertSame(2, $book->getPage());
              $kindle = new Kindle();
              $book = new EbookAdapter($kindle);
              $book->open();
              $book->turnPage();
              $book->getPage();
              $this->assertSame(2, $book->getPage());
          }
      }
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!