Design Pattern gesucht!

  • Themenstarter Gelöschtes Mitglied 5909
  • Beginndatum
G

Gelöschtes Mitglied 5909

Gast
Da ich einen kleinen Knoten im Kopf habe frage ich hier mal nach :)

Und zwar habe ich zwei recht ähnliche Objekte, die einen Status haben.
Ein persistentes Objekt und ein Transferobjekt.

Java:
class Persistent {
  String state;
  //...
}

enum state {
   NEW, EDIT, PRODUCTION
}

class Transfer {
  State state;
  //...
}

Das Transferobjekt kommt über einen REST Service rein,
das Persistent Objekt ist das ggf. vorhandene pendent in der DB.

Nun möchte ich vor und nach jedem Statuswechsel bestimmte aktionen auslösen.
Als erstes habe ich an das State Pattern gedacht, aber ich habe kein verhalten,
dass den Status verändert, sondern ich habe einen Status wechsel,
dass ein verhalten auslöst. Also genau umgekehrt.

Folgendes möchte ich erreichen:
Bevor das Transferobjekt gespeichert wird (und in ein Persistent Objekt gemapped wird),
will ich validierungen durchführen. Danach möchte ich z.B. eine Email verschicken.

Was ich nicht machen kann:
- Das Transferobjekt verändern (interfaces implementieren etc.)
- Die Transferobjekte sind generiert und werden immer neu generiert
- Im Persistent Objekt kann ich nicht das State enum verwenden

Was ich machen will:
- StateListener registrieren (aufruf vor und nach dem übergang)
- Den vorgang ggf. abbrechen (validierung fehlgeschlagen,...)
- das ganze erweiterbar halten (neue states und transitions)

Was ich vermeiden will:
Java:
if (oldstate == ... && newstate == ...)
else if (oldstate == ... && newstate == ...)
else if (oldstate == ... && newstate == ...)
else if (oldstate == ... && newstate == ...)
else if (oldstate == ... && newstate == ...)
else if (oldstate == ... && newstate == ...)

Was ich nicht nutzen will:
- BPM Engine oder vergleichbar, da zu komplex, kostet zu viel performance
(da ich primär für die Daten keine SQL DB verwende)

Irgendjemand eine brauchbare Idee?
 

Landei

Top Contributor
Ich würde aus altem und neuem State einen Schlüssel basteln, und die zugehörige Aktion in einer Map ablegen, etwa:

Java:
Map<String, Runnable> map = new HashMap<String, Runnable>();
map.add("" + NEW + EDIT, new Runnable(){public void run(){ action1(); }});
map.add("" + NEW + PRODUCTION, new Runnable(){public void run(){ action2(); }});
...

Runnable r = map.get("" + oldstate + newstate);
if (r != null) r.run();

Statt Runnable könnte man natürlich auch einen spezialisierten funktionsartigen Wrapper benutzen, der z.B. passende Argumente akzeptiert.
 
G

Gelöschtes Mitglied 5909

Gast
Das sind schonmal sehr gute Denkanstöße, Danke!

Was haltet Ihr davon, wenn ich Landeis vorschlag mit dem Stragety Pattern kombiniere, sodass sich die angewandte Strategy aus dem zusammengesetzten Key Ergibt?

// Edit:

was haltet ihr davon? Da ich aber mehrere diese Objektpärchen habe muss ich mir nurnoch überlegen wie ich das möglichst generisch lösen kann, da ich die Transferobjekte keiner interfaces implementieren kann. Warscheinlich nehm ich da dann reflection.

Java:
class Transition {
	String oldState;
	State newState;
		
	// Transitions als Konstanten merken
	
	equals, hashcode!

}

interface TransitionContext {
	Persistent persistent;
	Transfer transfer;
}

interface TransitionListener {
	void beforeTransition(Transition, TransitionContext context);
	void afterTransition(Transition, TransitionContext context); 

}

class TransitionManager {

	Map<Transition, TransitionListener> listeners = new HashMap<Transition, TransitionListener>();

	void addTransitionListener(Transition transition, TransitionListener listener) {
		...
	}
	
	void beforeTransition(Persistent persistent, Transfer transfer) {
		TransitionContext context = createContext(persistent, transfer);
		Transition transition = getTransition(context);
		TransitionListener listener = listeners.get(transition);
		if (listener != null) {
			listener.beforeTransition(transition, context);
		}
	}

	void afterTransition(Persistent persistent, Transfer transfer) {
		TransitionContext context = createContext(persistent, transfer);
		Transition transition = getTransition(context);
		TransitionListener listener = listeners.get(transition);
		if (listener != null) {
			listener.afteTransition(transition, context);
		}
	}
	

}
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Visito/Besucher Design-Pattern/Strukturmuster Softwareentwicklung 4
H2SO3- design pattern: code in model classes Softwareentwicklung 5
D Design Pattern Softwareentwicklung 6
S Design Pattern für zwei abhängige Klassen Softwareentwicklung 8
K Design Pattern für einen simple Rechenmaschine Softwareentwicklung 18
B Design Patterns und die Keywords Softwareentwicklung 22
P Zwei Fragen zum Design Softwareentwicklung 16
K Einlesen einer .dat-Datei (verschiedene Formate) | Entwicklung unter Einsatz von Design-Patterns Softwareentwicklung 0
L Design Patterns zu abstraktem Problem Softwareentwicklung 2
M Sauberes Design, Clean Code, etc. pp. Softwareentwicklung 47
G Projekte die Design by Contract verwendet haben?? Softwareentwicklung 2
C Wiki für ein Uni - High Level Design Softwareentwicklung 5
V Design Patters - Observer Softwareentwicklung 6
Jay_030 Checkstyle: Lösungsvorschläge für Design for Extension Softwareentwicklung 7
J Design Patterns in Programm hineinfließen lassen Softwareentwicklung 23
G Suche Programm für Masken Design für Pflichtenheft Softwareentwicklung 5
W Frage zu a)Innere Klassen und b)OO Design Softwareentwicklung 13
D Datenbank-Design Softwareentwicklung 3
M Datei-Typ-Design Softwareentwicklung 10
S Design-Frage: Wie viele Fassaden? Softwareentwicklung 4
G Test First <-> Design First Softwareentwicklung 6
B Haskell pattern matching in if else Anweisung umschreiben Softwareentwicklung 3
E Frage zu Dekorator-Pattern Softwareentwicklung 2
slawaweis Factory-Builder Pattern? Softwareentwicklung 6
B konfigurierbare Objekte - Singelton und Factory Pattern Softwareentwicklung 3
C Flyweight-Pattern verhält sich unerwartet Softwareentwicklung 5
U Decorator Pattern in der Java API Softwareentwicklung 6
M Proxy Pattern - Verständnisfrage Softwareentwicklung 2
0 Unklarheiten beim State Pattern Softwareentwicklung 2
N Composite pattern Softwareentwicklung 2
N Pattern Softwareentwicklung 2
L Builder Pattern Softwareentwicklung 6
1 Factory-Pattern: Bitte um Tipps zur Anwendung Softwareentwicklung 3
L Pattern Softwareentwicklung 3
J DAO Pattern bei komplexen Datenbankzugriffen Softwareentwicklung 2
M IllegalStateException - Problem mit GUI und Observer pattern Softwareentwicklung 4
G Pattern für Datenbank Anwendung Softwareentwicklung 22
A Iterato-Pattern und Innere Klassen Softwareentwicklung 9
F Unterschied Command und Strategy pattern Softwareentwicklung 4
F Wann Observer Pattern nehmen und Vorteile davon? Softwareentwicklung 5
H Frage ueber Prototype Pattern? Softwareentwicklung 2
G Warum/Wann mehrere Modells beim MVC-Pattern verwenden ? Softwareentwicklung 7
timomeinen DAO Pattern - Relationen mit DTO abbilden Softwareentwicklung 9
D Singleton pattern Softwareentwicklung 19
M decoration pattern Softwareentwicklung 2
E Regular Expression gesucht: Zeichen nur finden, wenn ihm kein anderes voransteht Softwareentwicklung 2
Manello PET 2001 Basic gesucht! Softwareentwicklung 11
Z Diensttechnologie a la WebServices gesucht Softwareentwicklung 3
D 1a UI Webkomponenten Library gesucht Softwareentwicklung 26
K Zweitprogrammiersprache gesucht Softwareentwicklung 13
W Entwurfsmuster gesucht Softwareentwicklung 2
I Tool / Programm etc. zur Testdokumentation gesucht Softwareentwicklung 2
ruutaiokwu reverse engineering tool gesucht: source code -> uml klassendiagramm Softwareentwicklung 5
C Dokutool gesucht Softwareentwicklung 2
G Graphische Notation fuer Netzwerktopologie gesucht Softwareentwicklung 3
T Gesucht: Programmiersprache die man compilen kann Softwareentwicklung 21
S MDA Buch gesucht Softwareentwicklung 2
ff Suchalgorithmus gesucht Softwareentwicklung 15
T SQL-Statement gesucht die 2. Softwareentwicklung 15
T SQL Statement gesucht Softwareentwicklung 15
S Beispiel für MVC gesucht Softwareentwicklung 53
D C# zu Java - Übersetzer gesucht. Softwareentwicklung 3
M Übersetzer für Programmhilfe gesucht Softwareentwicklung 2
R ODBC-Befehle gesucht Softwareentwicklung 28

Ähnliche Java Themen

Neue Themen


Oben