El patrón de diseño Adaptar tiene una clase que convierte la interfaz de una clase para que sea lo que otra clase espera.También conocido como Wrapper.
Los adaptadores son útiles si desea utilizar una clase que no tiene los métodos exactos que necesita y no podemos utilizar directamente sus funcionalidades usando la herencia porque no hay compatibilidad entre nuestras clases, no se puede cambiar la clase original. El adaptador puede tomar los métodos a los que puede acceder en la clase original y adaptarlos a los métodos que necesita.
Ejemplo Piano
Tenemos el siguiente ejemplo en UML:

Figura 1. Adapter Piano
En este ejemplo simularemos un piano acústico como un piano eléctrico. Comenzamos entonces con la clase abstracta Piano:
abstract class Piano { abstract function encender(); abstract function apagar(); }
Ahora escribimos como sería un piano eléctrico:
class PianoElectric extends Piano { public function encender() { echo "Tocando piano eléctrico.."; } public function apagar() { echo "Apagando piano eléctrico.."; } }
Ahora el piano acústico que deseamos adaptar:
class PianoAcustic { public function tocar() { echo "Tocando piano acústico.."; } public function parar() { echo "Dejar de tocar piano acústico.."; } }
Ahora el adapter:
class PianoAcusticAdapter extends Guitar{ private $pianoAcustic; public function __construct(){ $this->pianoAcustic = new PianoAcustic(); } public function encender() { $this->pianoAcustic->tocar(); } public function apagar() { $this->pianoAcustic->parar(); } }
De esta manera podemos llamar a PianoAcustic como las demás instancias de Guitar.
echo "<h1>Ejemplo Piano</h1>"; $pianoElectric = new PianoElectric(); $pianoElectric->encender(); $pianoElectric->apagar(); echo "<br>"; $pianoAcustic = new PianoAcusticAdapter(); $pianoAcustic->encender(); $pianoAcustic->apagar();
De esta manera podemos tratar entonces al Piano acústico como un Piano eléctrico en todo el proyecto. El resultado:

Figura 2. Resultados del ejemplo
Fuentes:
November 15, 2017 at 8:57 am
Hola Arturo, una observación, la clase abstracta no debería llamarse “Piano” en vez de “Guitar”?
Estrictamente hablando podría ser “Guitar” pero me parece que para propósitos del ejemplo es mas lógico denominarla “Piano”.
Saludos,