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:

adapter.PNG

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:

Screenshot-2017-10-20 http localhost.png

Figura 2. Resultados del ejemplo

Fuentes: