Adaptar um leitor digital (Kindle) para que ele possa ser utilizado pelo
cliente como um livro comum (Book), sem modificar o cliente nem a classe
externa.
Book(Target): contrato esperado pelo cliente, comopen(),turnPage()egetPage(): int.- **
PaperBook:** implementação convencional deBook`. EBook(Adaptee): contrato externo comunlock(),pressNext()egetPage(): array.- **
Kindle:** implementação deEBook`, representando o leitor digital incompatível com o cliente. EBookAdapter(Adapter): implementação deBookque contém umEBooke traduz suas operações.
O cliente conhece apenas Book, mas Kindle disponibiliza nomes e tipos
diferentes:
| Cliente espera | Kindle oferece |
|---|---|
open() |
unlock() |
turnPage() |
pressNext() |
getPage(): int |
getPage(): array |
Além da diferença de nomes, o Kindle retorna a página atual e o total de
páginas, por exemplo [2, 100]. O cliente precisa somente da página atual.
O adaptador utiliza composição e injeção de dependência:
class EBookAdapter implements Book { public function __construct(protected EBook $eBook) { } }
As chamadas são traduzidas da seguinte forma:
public function open() { $this->eBook->unlock(); } public function turnPage() { $this->eBook->pressNext(); } public function getPage(): int { return $this->eBook->getPage()[0]; }
Assim, o cliente trabalha com Book, enquanto o adaptador conhece os
detalhes específicos de EBook e Kindle.