Decorator, Adapter oder Proxy – Was bist du eigentlich?

Für alle denen beim Lesen des Titels nichts dazu eingefallen ist, es geht in diesem Artikel um Entwurfsmuster, genauer um die Strukturmuster Decorator, Adapter und Proxy.

Häufig kommt es vor, dass diese drei Muster aufgrund gewisser oberflächlicher Ähnlichkeiten verwechselt oder pauschal zum Decorator gemacht werden.

Dabei verfolgen alle drei doch recht unterschiedliche Ziele und die will ich heute möglichst kurz gegenüberstellen.

Zunächst klären wir erstmal was die drei gemeinsam haben. Alle drei Muster kontrollieren den Zugriff auf ein Objekt.

Decorator

Das wichtigste Merkmal eines Decorators ist, dass er den Typ des zu dekorierenden Objektes nicht verändert. Wollen wir also ein Animalobjekt dekorieren, dann muss unser Dekorierer von Animal erben und alle Methodenaufrufe an das in ihm gekapselte Objekt delegieren.

Beim Weiterleiten der Methodenaufrufe kann nun das Verhalten verändert werden und das ohne Vererbung zur Laufzeit.

Methoden können quasi abgeschaltet werden, indem sie nicht weiterleiten. Andere Methoden könnten die Werte vor dem Weiterleiten verändern. Auch neue, zusätzliche Methoden sind möglich.

Beispiele

  • Streams (in Java)
  • Verändern von GUI-Elementen

Adapter

Im Gegensatz zum Decorator verändert der Adapter gewollt den Typ des gekapselten Objektes. Das Muster eignet sich, um bestehende Komponenten an eine neue Schnittstelle anzupassen.

Wenn sich die Katze also wie eine Kuh verhalten soll…

class CatToCowAdapter extends Cow {
  private Cat cat;

  // andere Methoden

  public void muh() {
    this.cat.miau();
  }
}

Proxy

Ein Proxy ist ein Stellvertreter für die “echten” Objekte, wenn diese zum Beispiel nicht sofort verfügbar sind oder nicht alle Ressourcen freigeben dürfen. Soll zum Beispiel ein Bild in einer GUI-Anwendung über das Netzwerk geladen werden, würde das ggf. die Anwendung während der Ladezeit ausbremsen.

Ein ImageProxy könnte in einem eigenen Thread auf das Bild warten und in der Zwischenzeit eine Ersatzgrafik anzeigen (animierte Sanduhr etc.).

Über Proxy-Objekte lässt sich auch der Zugriff auf Datenstrukturen kontrollieren. Dabei würde der Proxy kontrollieren, wem das Datenobjekt gehört und nur die dementsprechenden Lese- und Schreibzugriffe erlauben.

Beispiele

  • Laden von Ressourcen
  • Kontrollieren von Daten

Kommentare sind deaktiviert.

Schlagwörter: Adapter, Amazon, Animation, Annotations, Anonyme Klasse, Ant, Apache, API, Array, ArrayAccess, Attachment, AutoLoader, Bedienung, Bedingung, Benchmark, Bildbearbeitung, BOM, Bootstrap, Bot, Byte Order Mark, Callback, CamelCase, Canvas, Captcha, Cheatsheet, CLI, Closure, Cloud, CodeSniffer, Community, Comparator, Contest, Controller, Converter, CouchDB, Countable, Cronjob, CSV, CustomLibrary, Custom_Model, Data Mapper, Datei, Datenbank, Datenstruktur, Datentypen, Dating, Decorator, Dekorierer, Design Patterns, Dump, Duplikat, each, Eclipse, Entwicklung, Entwurfsmuster, Enum, Erweiterung, Eventhandling, Exception-Handling, Extension, Factory, Fehler, Flash, Foreach, Formatierung, Formular, Funktion, Futon, Header, HTML5, HTTP, IDE, If, Implementierung, InnoDB, Interceptor, Interface, isset, Iterator, Java, JavaScript, jQuery, Konfiguration, Konsole, Kontrollstruktur, kopieren, Late Static Binding, Layout, Linux, Listeners, Logging, Löschen, Magento, Magic Methods, Marketing, Methode, Model, MVC, MySQL, NetBeans, Objekt, Observable, Observer, OOP, Operator, Parameter, Partnersuche, Performance, PHP, phpMyAdmin, PHPUnit, Plugin, Proxy, Qualitätssicherung, Query, Reflection, Request, Response, Rest-API, Rockstar, Routing, S3, Samba, Scheifen, Schleife, Schutz, Secure Shell, Selbstreferenz, Shop, Sicherheit, Sicherung, Singleton Pattern, SOAP, Sortierung, Sourcecode, Spam, Speicherproblem, Spickzettel, SPL, SSH, Statement, Stellvertreter, Strategy Pattern, Stream, String, Sun VirtualBox, Support, Switch, Symfony, Symfony2, Symfony Live, Tag, Template, Template Method, Ternär Operator, Testing, Thumbnail, Tool, Tour, Twig, Type-Cast, Umwandlung, Underscore, unset, Vererbung, Verzweigung, Video, Videospiel, Virtualisierung, Visitor Pattern, Vorschaubild, walk, Webserver, Webservice, Weiterleitung, Wrapper, Youtube, Zeitsteuerung, Zend Framework, Zend_Cloud, Zend_CodeGenerator, Zend_Http_Client, Zend_Service, Zugriffsmethode