Upload
dangcong
View
221
Download
0
Embed Size (px)
Citation preview
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Ausgewählte Entwurfsmuster
Vergleich der Implementierung inSmalltalk, Java und ObjectPascal
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Bekannte Entwurfsmuster
• Singleton• Beobachter• Zustand• Fassade• Abstrakte Fabrik
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Muster (Allgemein)
„Vorlage, Modell; Vorbild, Vollkommenes in seiner Art; [..] einzelnes Stück zur Ansicht, zur Auswahl [..]“Wahrig Deutsches Wörterbuch
„Jedes Muster beschreibt ein in unserer Umwelt beständig wiederkehrendes Problem und erläutert den Kern der Lösung für dieses Problem, so dass Sie diese Lösung beliebig oft anwenden können, ohne sie jemals ein zweites Mal gleich auszuführen.“Christopher Alexander
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Struktur
• Entwurfsmuster• Singleton
– Allgmeine Darstellung– Implementierungsaspekte in Java,
ObjectPascal und Smalltalk
• Vermittler– Allgemeine Darstellung– Implementierungsaspekte in Java,
Smalltalk und ObjectPascal
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Quellen
E. Gamma, R. Helm, R. Johnson, J. Vlissides. Design Patterns, Addison-Wesley, 1994
M. Fowler. Analysis Patterns, Reusable Object Models, Addison-Wesley, 2000
A. Bien, J2EE Patterns, Entwurfsmuster für die J2EE, Addison-Wesley, 2002
Hillside Group, http://hillside.netGoogle, search?q=design+patterns
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Entwurfsmuster (nach GoF)
• Mustername• Problemabschnitt• Lösungsabschnitt• Konsequenzenabschnitt
Kein Muster jedochADTs (einfach) oder Architekturen (komplex)Zusammensetzung anderer Muster (zB MVC)
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Dargestellte Entwurfsmuster
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton
• Sichert ab, dass eine Klasse genau ein Exemplar besitzt
• Stellt globalen Zugriffspunkt darauf bereit
Verwendung• Druckerspooler, Dateisystem, Logging,
Datenbank, etc.
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (Struktur)
attributeseinzigesExemplarsingletonDaten
operationsexemplargibSingletonDatensingletonOperation
Singleton
initialisiere ggf einiziges Exemplarreturn einzigesExemplar
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (Konsequenzen)
• Zugriffskontrolle auf das Exemplar• Verfeinerung von Funktionalität• Variable Anzahl von Exemplaren• Flexibler als Klassenmethoden
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (Java)
• Garantie des einzigen Exemplars durch Klassenvariable
• Privater Konstruktor verhindert Exemplarbildung durch Klienten
• Lazy-Initialization ermöglicht Konfiguration
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (Java Implementierung)
public class Singleton { private static Singleton einzigesExemplar; private Singleton(){ // nicht sichtbar für Klienten
} public static Singleton exemplar(){ // ggf einziges Exemplar erzeugen
if(einzigesExemplar==null) einzigesExemplar = new Singleton();
return einzigesExemplar; }}
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (Java Klient)
public class SingletonTest {
public static void main(String[] args) { // s1 = new Singleton() nicht möglich
// erzeugung des einzigen Objekts
Singleton s1 = Singleton.exemplar();
// bereits erzeugtes Objekt zurückgeben
Singleton s2 = Singleton.exemplar();
// es gilt: s1.equals(s2) && (s1==s2)
}}
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Exkurs: Objekte in ObjectPascal
• Typenstrenge Überprüfung zur Übersetzungvar meinExemplar: TMeineKlasse;begin meinExemplar := TMeinNachfahre.Create;
• Speicherverantwortlichkeit beim EntwicklerObjekterzeugung;try Objektverwendung;finally Objektfreigabe;end;
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (ObjectPascal)
• Verwaltung des einzigen Exemplars durch globale Variable
• Referenzzählung notwendig
Achtung:• Privater Konstruktor kann Exemplarbildung
vom Klienten nicht verhindern• Freigabe durch Klienten möglich
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (ObjectPascal Impl.)
interface
type TSingleton = class private constructor Create; public class function Exemplar: TSingleton; procedure GibFrei; end;
implementation
constructor TSingleton.Create;begin // nicht sichtbar für Klienten // (verwendet TObject.Create)end;
var FSingleton: TSingleton; FSingletonReferenzen: Integer;
class function TSingleton.Exemplar: TSingleton;
begin if not Assigned(FSingleton) then FSingleton := TSingleton.Create;
Inc(FSingletonReferenzen); Result := FSingleton;end;
procedure TSingleton.GibFrei;begin Dec(FSingletonReferenzen); if FSingletonReferenzen<=0 then FreeAndNil(FSingleton);end;
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (ObjectPascal Klient)var s1, s2: TSingleton;begin // s1 := TSingleton.Create möglich aber fehlerhaft
// erzeugung des einzigen Objekts s1 := TSingleton.Exemplar; try // bereits erzeugtes Objekt zurückgeben s2 := TSingleton.Exemplar; try // es gilt: s1=s2 finally // s2.Free möglich aber fehlerhaft s2.GibFrei; end; finally s1.GibFrei; end;end.
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (ObjectPascal Erweitert)
Besseres Design möglich• Transparente Referenzzählung über NewInstance und FreeInstance
• Ressourcenverwaltung durch implizite Referenzzählung
• Zuweisbare lokale Konstante statt globaler Variablen
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Exkurs: Objekte in Smalltalk
• Erzeugung durch Nachricht an KlassemeinObjekt := MeineKlasse new.meineMenge := ArrayedCollection with: 5 with: 6. meinString := String readFrom: aStream.
• Objekt durch speziellen KonstruktormeineMenge := #(1, 2, 3). meinString := 'multiply 6 by 9'.
• Erzeugung durch Nachricht an ObjektmeinPunkt := 23 @ 137. meineSumme := 6 * 9.
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (Smalltalk)
• Garantie des einzigen Exemplars durch Klassenvariable
• Erzeugung über new verursacht Fehler und verhindert Erzeugung weitere Exemplare
• Vorkonfiguration des Exemplars im Image möglich
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (Smalltalk Implementierung)
Smalltalk.Examples defineClass: #Singleton superclass: #{Core.Object} indexedType: #none private: false instanceVariableNames: '' classInstanceVariableNames: 'einzigesExemplar ' imports: '' category: 'Examples'
Klassenmethoden für „instance creation“new self error: 'Zur Erzeugung Nachricht exemplar an Klasse schicken‚
exemplar einzigesExemplar isNil ifTrue:[einzigesExemplar := super new]. ^einzigesExemplar
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Singleton (Smalltalk Erweiterung)
Sogar transparente Erzeugung denkbar:new einzigesExemplar isNil ifTrue:[einzigesExemplar := super new]. ^einzigesExemplar
Aber: potenzielle Fehlerquelle:| left right |left := SingleWindow new.Right := SingleWindow new.left position: (100 @ 100).right position: (500 @ 100).
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Vermittler
• Definiert Objekt, das Zusammenspiel von Objekten kapselt
• Fördert lose Kopplung, durch Vermeidung gegenseitiger Bezugnahme von Objekten
• Ermöglicht Zusammenspiel von Objekten zu variieren, ohne Objekte selbst zu verändern
Häufig eingesetzt in Dialogsystemen
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
operationserzeugeWidgetswidgetGeaendert(..)zeigeDialog
DialogDirektor
operationsgeaendert
Widget
direktor.w idgetGeaendert(this)
operationsGibAusw ahl
ListBox
operationsSetzeText
EingabeFeldoperations
erzeugeWidgetsw idgetGeaendert(..)
ZeichensatzDialogDirektor
direktor
Vermittler (Struktur)
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Vermittler (Ablauf)
: Klient : ZeichensatzDialogDirektor : ListBox : EingabeFeld
zeigeDialog
w idgetGeaendert
gibAusw ahl
setzeText
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Vermittler (Konsequenzen)
• Schränkt Unterklassenbildung ein• Entkoppelt Kollegenobjekte• Vereinfacht Protokoll der Objekte • Abstrahiert von Art der Zusammenarbeit
• Zentralisiert Steuerung
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Vermittler (Java)
• Ereignisorientiert• Widgets unterstützen Beaobachtermuster• Interfaces für Verbund verantwortlich genau eine Methode in Klasse pro Rolle
• Zusätzliche Informationen beim Widget hinterlegbar, um Sender zu identifizieren
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Vermittler (Java Beispielstruktur)
attributesabbrechenButtonokButton
operationsinitialisiereWidgetsverw endeDatenverw erfeDaten
VermittlerVorlage
«interface»ActionListener
operationsinitialisiereWidgetsActionPerformed
VermittlerUnterschieden
operationsinitialisiereWidgets
VermittlerDelegiert
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Vermittler (Java Fallunterscheidung)
public class VermittlerUnterschieden extends VermittlerVorlage implements ActionListener{
protected void initialisiereWidgets() { okButton.addActionListener(this); abbrechenButton.addActionListener(this); }
public void actionPerformed(ActionEvent arg0) { if(arg0.getSource()==okButton) verwendeDaten(); else if (arg0.getSource()==abbrechenButton) verwerfeDaten(); }}
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Vermittler (Java Delegation)
public class VermittlerDelegiert extends VermittlerVorlage{
protected void initialisiereWidgets() { okButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ verwendeDaten(); } });
abbrechenButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { verwerfeDaten(); } }); }}
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Vermittler (Smalltalk)
• Nachrichten(-Sendungen) sind Objekte• Selektion über Symbol bei Nachricht
perform: aSelector with: anArgument• Registratur in ActionList über Tripel
when: anEvent send: aSelector to: anObject• Versand von MessageSend im Ereignisfall
triggerEvent: anEvent
Alternative: Funktions Closures
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Vermittler (Smalltalk Beispiel)
Smalltalk/Vself addSubPane: (ListPane new
paneName: 'meineListPane'; owner: self; when: #select send: #listSelect: to: self).Smalltalk/X
| meinView |meinView := StandardSystemView new.
Button label: 'OK' action: [self verwendeDaten] in: meinView.Button label: 'Abbrechen' action: [self verwerfeDaten] in: meinView.
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Vermittler (ObjectPascal)
• Vermittler als Standard zur Dialoggestaltung• Referenz auf Methode eigener Datentyp
TNotifyEvent = procedure(Sender: TObject) of object;• Verwendung ale normale Variable
var meinEvent, anderesEvent: TNotifyEvent; begin // notwendig: TDieseKlasse.ButtonClick(Sender: TObject); meinEvent := Self.ButtonClick; anderesEvent := meinEvent;
// entspricht Self.ButtonClick(AButton); anderesEvent(AButton);
Ausgewählte Entwurfsmuster - Vergleich der Implementierung in Smalltalk, Java und ObjectPascal 1Heiko Behrens
Vermittler (ObjectPascal Beispiel)
beginwith TButton.Create(Self) dobegin Caption := 'OK'; Parent := Self; OnClick := VerwendeDaten;end;
with TButton.Create(Self) dobegin Caption := 'Abbrechen'; Parent := Self; OnClick := VerwerfeDaten;end;