Hallo,
so dann bin ich jetzt beim State. icon_confused.gif Ich habe mir wieder das Beispiel auf der einen Seite dazu angesehen mit den Kontoeinzahlungen und Auszahlungen bzw. auch ins Java übersetzt und in eclipse laufen lassen.
Meiner Meinung nach beruhen viele Design Patterns auf dem selben Prinzip. Es werden immer generalisierte Objekte definiert in denen sich dann Objekte von konkreten Klassen befinden. Somit kann ich dann immer eine Unterklassen hinzufügen und es ändert sich nur das new SilverState zb. wenn ich diese Klasse austausche. Wie in diesem Beispiel State state = new SilverState(0.0, this);
In dem Pattern gehts darum, dass ich in meiner Kontextklasse (Account) nur (in diesem Beispiel nur eines) ein Objekt von der Oberklasse State definiere, aber in diesem Objekt ein Objekt einer konkreten Unterklasse - SilverState erzeuge. Dadurch wird das Konto mit Anfangswerten initialisiert. Die Klasse State definiert auch die abstrakten Methoden für das abheben, einzahlen, etc. Das heißt, wenn man jetzt zB. was vom Konto behebt wird in der Methode Deposit mit dem generalisierten state-Objekt die Deposit Methode aufgerufen und jenachdem welches Objekt sich gerade in dem state-Objekt befindet (SilverState, RedState, GoldState) wird die entsprechende Methode dazu aufgerufen. Dann wird der neue Kontostand im StateChangeCheck berechnet, falls sich das Konto jetzt zB. im negativen Bereich befindet, wird ein neues Objekt der konkreten Unterklasse RedState erzeugt und das generalisierte State Objekt state erzählt eine Referenz auf dieses Objekt und somit wird bei einer neuerlichen Kontobewegung die Methoden der RedState Klasse verwendet.
Vorteile aus Sicht der Wiederverwendung wäre für mich hier: Man kann beliebige Klassen von Zuständen hinzufügen - solange sie die Methoden der generalisierten State Klasse implementieren können sie von der Context Klasse in Anspruch genommen werden ohne das sonst was am Code geändert werden muss. Klassen können auch beliebig ausgetauscht werden, jedoch muss ich das bei der Objekt-erzeugung in den anderen Klassen beachten, falls sich die Klassennamen ändern. (Also wenn ich zB. jetzt SilverState Klasse gegen GreenState Klasse austausche, dann muss ich auch die Objekterzeugungen zB. in der RedState Klasse, wo ja ein SilverState Objekt erzeugt wird entsprechend in GreenState umbenennen.
Was sagst du bzw. ihr dazu? - Habe ich das alles richtig verstanden, gibts sonst noch konkrete Vorteile, die dieses Pattern aufweise oder irgendwelche Hintergründe die ich noch nicht angesprochen habe? bahnhof.gif Bzw. konkrete real-world Anwendungen?
lg
patrick
Reply by SnoopP
Nunja.. die Wiederverwendung beim State-Pattern ist jetzt nicht soo das Thema meiner Meinung nach... - Wiederverwendung ergibt sich durch OOP natürlich per Definition icon_wink.gif - dadurch, dass in Design-Patterns wie du schon gesagt hast, immer auf übergeordnete Schnittstellen geachtet wird, kann das meiste beliebig erweitert werden...
Beim State-Pattern gehts um eine Umsetzung von Zustandsbasiertem Verhalten... insb. wenn man sog. Statecharts (Zustandsdiagramme) kennt, wäre das State-Pattern ein Ansatz (wenn auch ein sehr kostspieliger) Zustände und Zustandsübergänge in einer Programmiersprache umzusetzen... und zwar auch so, dass diese automatisch per Codegenerierung erfolgen könnte...
Aber zur Wiederverwendung - natürlich können jetzt beliebige Zustände noch hinzugefügt werden... ist also ganz prima erweiterbar...
(ich hatte übrigens gehofft, dass du deine Antwort doch in einen neuen Thread packst, damit auch andere hier nochmal reingucken können... so hat das Thema das gerade diskutiert wird nix mehr mit dem Topic-Titel zu tun!)
so dann bin ich jetzt beim State. icon_confused.gif Ich habe mir wieder das Beispiel auf der einen Seite dazu angesehen mit den Kontoeinzahlungen und Auszahlungen bzw. auch ins Java übersetzt und in eclipse laufen lassen.
Meiner Meinung nach beruhen viele Design Patterns auf dem selben Prinzip. Es werden immer generalisierte Objekte definiert in denen sich dann Objekte von konkreten Klassen befinden. Somit kann ich dann immer eine Unterklassen hinzufügen und es ändert sich nur das new SilverState zb. wenn ich diese Klasse austausche. Wie in diesem Beispiel State state = new SilverState(0.0, this);
In dem Pattern gehts darum, dass ich in meiner Kontextklasse (Account) nur (in diesem Beispiel nur eines) ein Objekt von der Oberklasse State definiere, aber in diesem Objekt ein Objekt einer konkreten Unterklasse - SilverState erzeuge. Dadurch wird das Konto mit Anfangswerten initialisiert. Die Klasse State definiert auch die abstrakten Methoden für das abheben, einzahlen, etc. Das heißt, wenn man jetzt zB. was vom Konto behebt wird in der Methode Deposit mit dem generalisierten state-Objekt die Deposit Methode aufgerufen und jenachdem welches Objekt sich gerade in dem state-Objekt befindet (SilverState, RedState, GoldState) wird die entsprechende Methode dazu aufgerufen. Dann wird der neue Kontostand im StateChangeCheck berechnet, falls sich das Konto jetzt zB. im negativen Bereich befindet, wird ein neues Objekt der konkreten Unterklasse RedState erzeugt und das generalisierte State Objekt state erzählt eine Referenz auf dieses Objekt und somit wird bei einer neuerlichen Kontobewegung die Methoden der RedState Klasse verwendet.
Vorteile aus Sicht der Wiederverwendung wäre für mich hier: Man kann beliebige Klassen von Zuständen hinzufügen - solange sie die Methoden der generalisierten State Klasse implementieren können sie von der Context Klasse in Anspruch genommen werden ohne das sonst was am Code geändert werden muss. Klassen können auch beliebig ausgetauscht werden, jedoch muss ich das bei der Objekt-erzeugung in den anderen Klassen beachten, falls sich die Klassennamen ändern. (Also wenn ich zB. jetzt SilverState Klasse gegen GreenState Klasse austausche, dann muss ich auch die Objekterzeugungen zB. in der RedState Klasse, wo ja ein SilverState Objekt erzeugt wird entsprechend in GreenState umbenennen.
Was sagst du bzw. ihr dazu? - Habe ich das alles richtig verstanden, gibts sonst noch konkrete Vorteile, die dieses Pattern aufweise oder irgendwelche Hintergründe die ich noch nicht angesprochen habe? bahnhof.gif Bzw. konkrete real-world Anwendungen?
lg
patrick
Reply by SnoopP
Nunja.. die Wiederverwendung beim State-Pattern ist jetzt nicht soo das Thema meiner Meinung nach... - Wiederverwendung ergibt sich durch OOP natürlich per Definition icon_wink.gif - dadurch, dass in Design-Patterns wie du schon gesagt hast, immer auf übergeordnete Schnittstellen geachtet wird, kann das meiste beliebig erweitert werden...
Beim State-Pattern gehts um eine Umsetzung von Zustandsbasiertem Verhalten... insb. wenn man sog. Statecharts (Zustandsdiagramme) kennt, wäre das State-Pattern ein Ansatz (wenn auch ein sehr kostspieliger) Zustände und Zustandsübergänge in einer Programmiersprache umzusetzen... und zwar auch so, dass diese automatisch per Codegenerierung erfolgen könnte...
Aber zur Wiederverwendung - natürlich können jetzt beliebige Zustände noch hinzugefügt werden... ist also ganz prima erweiterbar...
(ich hatte übrigens gehofft, dass du deine Antwort doch in einen neuen Thread packst, damit auch andere hier nochmal reingucken können... so hat das Thema das gerade diskutiert wird nix mehr mit dem Topic-Titel zu tun!)