Lösungsansatz gesucht (Richtung: Deco - Pattern)

Ich such eine möglichen, praktikablen Lösungsansatz für folgendes Problem:

Ich habe eine GenericDAO die für n unterschiedlichen Klassen verfügbar ist. Eine DTO kann neben Primary Key und spezifischen Daten über mehrer weitere Attribut wie

[ul]
[li]publish (Kennzeichnung zum veröffentlichen) und / oder
[/li][li]deleted (Kennzeichnung als gelöscht) und / oder
[/li][li]order (Zahl für die Sortierreihenfolge) und / oder
[/li][li]default (Kennzeichnung als default)
[/li][/ul]

verfügen.

Beispiel:

DTO_A
id
publish (Kennzeichnung zum veröffentlichen)
deleted (Kennzeichnung als gelöscht)

DTO_B
id
order (Zahl für die Sortierreihenfolge)
default (Kennzeichnung als default)

DTO_C
id
publish (Kennzeichnung zum veröffentlichen)
order (Zahl für die Sortierreihenfolge)

verfügen. Nun könnte ich zwar in der GenericDAO Klasse alle Funktionen für die Behandlung von allen Attributen definieren, z.B.

setDeleted(boolean deleted)

Aber ich möchte nur die Funktionen öffentlich zugänglich machen, über dessen Eigenschaften die DTOs verfügen. D.h.

für die einzelnen DTOs müsste die DAO Klasse neben den standmässigen CRUD - Funktionen wie folgt aussehen

DTO_A_DAO extends GenericDAO<DTO_A>
— boolean isPublish(int id)
— void setPubish(DTO dto, boolean publish)
— boolean isDeleted(int id)
— void setDeleted(DTO dto, boolean publish)

DTO_B_DAO extends GenericDAO<DTO_B>
— int getOrder(int id)
— void setOrder(DTO dto, int Order)
— boolean isDefault(int id)
— void setDefault(DTO dto, boolean default)

DTO_C_DAO extends GenericDAO<DTO_C>
— boolean isPublish(int id)
— void setPubish(DTO dto, boolean publish)
— int getOrder(int id)
— void setOrder(DTO dto, int Order)

Also im Prinzip ein Dekorationspattern allerdings bezogen auf Klassenebene / Funktionen und nicht auf Attributebene / Werte. Wie würdet ihr so ein Problem lösen?

Prinzipiell ist Decorator schon die Antwort auf deine Frage. Ich weiß nicht so recht was du dir mehr erwartest. Du kannst zusätzlich noch Interfaces einführen, wie z.B. Publishable welches die isPublish und setPublish definiert. Für sonstige Methoden ditto.

Dann kannst du dein DTO_B_DAO Objekt genauso wie dein DTO_C_DAO Objekt dort verwenden wo ein Publishable erwartet wird. Oder geht’s dir um eine Erkennung welche Methoden ein Objekt anbietet und das zur Laufzeit?

Ist Java 8 verfügbar? Dann könnten die von schlingel vorgeschlagenen Interfaces auch die jeweilige Funktionalität zur Verfügung stellen.

interessante Neuerung, ohne Instanzattributen in den Interfacen kann man hier damit aber gar nix machen, oder?

Fehlen von Instanzattributen ist der zentrale weiterhin bestehende Unterschied zu abstrakten Klassen,
Konstruktor auch noch, aber man kann ja auch theoretisch ganz ohne auskommen

[QUOTE=schlingel]Prinzipiell ist Decorator schon die Antwort auf deine Frage. Ich weiß nicht so recht was du dir mehr erwartest. Du kannst zusätzlich noch Interfaces einführen, wie z.B. Publishable welches die isPublish und setPublish definiert. Für sonstige Methoden ditto.

Dann kannst du dein DTO_B_DAO Objekt genauso wie dein DTO_C_DAO Objekt dort verwenden wo ein Publishable erwartet wird. Oder geht’s dir um eine Erkennung welche Methoden ein Objekt anbietet und das zur Laufzeit?[/QUOTE]
Ich meine das letztere. Ich versuchs nochmal zu beschreiben (hoffe es klappt :wink: )

Beim Deco Pattern kann man dynamische Fähigkeiten zu einer Klasse hinzugefügen. Alt bekanntes Beispiel das aufsummieren unterschiedlicher Zutaten zu einem Gericht, um den Preis zu ermitteln.

Ich möchte aber erreichen, das Funktionen „dynamisch“ hinzugefügt werden abhängig von der zugrundliegenden DTO, so das Funktionalitäten nur enthältlich sind die in der verarbeitenden DTO enthalten sind. Sprich, also irgendetwas in der Form von „echter“ Mehrfachvererbung - Deco - Pattern zur Laufzeit.

P.S.: oder sehe ich gerad den Wald vor lauter Bäumen nicht? :rolleyes:

*** Edit ***

[QUOTE=SlaterB;92928]interessante Neuerung, ohne Instanzattributen in den Interfacen kann man hier damit aber gar nix machen, oder?

Fehlen von Instanzattributen ist der zentrale weiterhin bestehende Unterschied zu abstrakten Klassen,
Konstruktor auch noch, aber man kann ja auch theoretisch ganz ohne auskommen[/QUOTE]
Wenn ich deinen Link richtig verstehe ist es es genau das was ich suche. Ich muss es nochmal genauer anschauen. Aber dank dir SlaterB