设计模式 - 结构 - 适配器模式
适配器模式
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
// 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 协议》,转载必须注明作者和本文链接