# Decorator Pattern in der Java API



## Ulfmann (24. Nov 2010)

Guten Morgen allerseits,

ich sitze grade an einer Dokumentation für ein Gruppen-Projekt, in dem es um die Umsetzung eines Entwurfsmusters (GoF) geht. Unsere Wahl fiel auf den Decorator und um dem Ganzen einen angemessenen, theoretischen Rahmen zu geben, möchte ich demonstrieren, wo und wie das Pattern in der Java API verwendet wird.

Könnte mich jemand in Richtung einer Stelle stubsen außer zu den Streams (bzw. Reader und Writer)? Ich hätte gern ein weiteres Beispiel, was vielleicht nicht ganz so gängig ist.

Jemand eine Idee?
Danke schonmal.


----------



## SlaterB (24. Nov 2010)

List l = new ArrayList();
        l = Collections.unmodifiableList(l);

liefert eine Liste die Daten aus dem Original durchreicht, aber Änderungen mit Exceptions quittiert


----------



## ThreadPool (24. Nov 2010)

Ulfmann hat gesagt.:


> Könnte mich jemand in Richtung einer Stelle stubsen außer zu den Streams (bzw. Reader und Writer)? Ich hätte gern ein weiteres Beispiel, was vielleicht nicht ganz so gängig ist.



Swing wäre noch so ein Kandidat.


----------



## Ulfmann (24. Nov 2010)

ThreadPool hat gesagt.:


> Swing wäre noch so ein Kandidat.



Inwiefern?

Danke euch beiden aber schonmal für die Hinweise, helfen weiter.


----------



## ThreadPool (24. Nov 2010)

Ulfmann hat gesagt.:


> Inwiefern?
> 
> Danke euch beiden aber schonmal für die Hinweise, helfen weiter.



Da musst du dir nur Klassen suchen die z.B. eine JComponent sind und eine JComponent als Attribut besitzen, das sind in fast allen Fällen dekorierbare Objekte. Auf die Schnelle habe ich für dich folgenden Link  aufgetan Best Practice Software Engineering - Decorator da wird das recht deutlich ausgewalzt mit einem Beispiel zu Swing.


----------



## SlaterB (24. Nov 2010)

also BorderDecorator aus dem Beispiel dort ist eine selbstgeschriebene Klasse,
in Swing an sich wüßte ich jetzt auf Anhieb keine, obwohl es das sicher gibt,

wenn ein JPanel andere Komponenten enthält ist das jedenfalls kein Decorator,
auch nicht komplexe feste Komponenten wie JComboBox, die mehrere feste Teilkomponenten verwenden,
auch ein TableRenderer, der ein JLabel zum Zeichnen benutzt, fällt kaum unter diese Kategorie,

ein Decorator muss schon exakt das Original-Interface erfüllen, als ein solches Objekt agieren, nur intern die Aufrufe weiterleiten

--

edit:
AWTEventMulticaster habe ich vor langer Zeit mal gesehen, der nimmt zwei beliebige Listener auf, ist selber auch ein Listener aller möglichen Arten, und leitet die Events an die enthaltenen Listener weiter,
aber sehr speziell, den trifft man selber eher nie an


```
public class AWTEventMulticaster implements 
    ComponentListener, ContainerListener, FocusListener, KeyListener,
    MouseListener, MouseMotionListener, WindowListener, WindowFocusListener,
    WindowStateListener, ActionListener, ItemListener, AdjustmentListener,
    TextListener, InputMethodListener, HierarchyListener,
    HierarchyBoundsListener, MouseWheelListener {

    protected final EventListener a, b;


    /**
     * Handles the componentResized event by invoking the
     * componentResized methods on listener-a and listener-b.
     * @param e the component event
     */
    public void componentResized(ComponentEvent e) {
        ((ComponentListener)a).componentResized(e);
        ((ComponentListener)b).componentResized(e);
    }
```


----------



## Ulfmann (24. Nov 2010)

Sehr cool, danke nochmals. Genau nach so etwas habe ich gesucht.

Das Beispiel mit dem EventMulticaster lasse ich aber vielleicht besser weg. Einerseits könnte ich da schnell unbeabsichtigt Fehler einbauen und andererseits (und infolge dessen) in Gefahr laufen, dass ich des Plagiarismus beschuldigt werde 
Ich finde, aus fachlicher Sicht genügt es, wenn ich

java.io.InputStream

Eine (besagte) Unterklasse von JComponent und eventuell

java.lang.ClassLoader
etwas näher betrachte.


----------

