Adapter Pattern

Ein Adapter im mechanischen Sinn dient der Verbindung zweier verschiedener Geräte. Diese Eigenschaft lässt sich auf Schnittstellen in der Programmierung ebenfalls anwenden. Das Adapter Pattern passt die API (Schnittstelle) einer gegebenen Klasse an die davon abweichende Erwartungen einer Implementierung an. Vorkommen könnte dies zum Beispiel beim Aufeinandertreffen zweier Bibliotheken von verschiedenen Autoren.

Ein Beispiel:

DispatcherInterface

Die konkrete Implementierung stellt für einen Dispatcher folgendes Interface zur Verfügung.

interface DispatcherInterface {
 
  public function init();
 
  public function run();
}

Dispatcher

Folgender Dispatcher wird bereit gestellt. Leider bietet dieser nicht die gewünschten Methoden und implementiert auch nicht das gegebene Interface.

class Dispatcher {
 
  public function prepare() {
 
  }
 
  public function preProcess() {
 
  }
 
  public function postProcess() {
 
  }
 
  public function execute() {
 
  }
}

DispatcherAdapter

Aus jetzt nicht weiter erläuterbaren Gründen ;-) besteht keine Möglichkeit Implementierung oder Dispatcher anzupassen. Dadurch kommt der (Dispatcher-)Adapter zum Einsatz, um Abhilfe zu schaffen.

class DispatcherAdapter implements DispatcherInterface {
 
  private $_dispatcher;
 
  public function __contruct(Dispatcher $dispatcher) {
    $this->_dispatcher = $dispatcher;
  }
 
  public function init() {
    $this->_dispatcher->prepare();
  }
 
  public function run() {
    $this->_dispatcher->preProcess();
    $this->_dispatcher->execute();
    $this->_dispatcher->postProcess();
  }
}

Der Adapter implementiert das gegebene Interface und mapped die Methoden auf die des konkreten Dispatchers. Dadurch werden Methoden "umbennannt" oder zusammengefasst und somit die notwendige API geschaffen.