SlideShare ist ein Scribd-Unternehmen logo
Design Pattern Teil 2 Ein etwas strukturierterer Ansatz http://flickr.com/photos/kingdesmond/477389196/
 
Design Pattern
Creational  Pattern http://flickr.com/photos/factoryjoe/204497604/
Structural  Pattern http://flickr.com/photos/factoryjoe/204497604/ Creational
Behavioral  Pattern http://flickr.com/photos/factoryjoe/204497604/ Creational Structural
http://flickr.com/photos/urbanwoodswalker/2578030316/
Basis-Pattern
Grundlegendes Basiswissen OOP Normale Klasse Abstrakte Klasse Interface
Grundlegendes Basiswissen OOP Normale Klasse Abstrakte Klasse Interface Beziehungen Is-A  (Inheritance) Has-A  (Composition) Can-Do  (Interfaces)
Vererbung Ente quaken() schwimmen() anzeigen() fliegen() StockEnte anzeigen() MoorEnte anzeigen() GummiEnte anzeigen() quaken()
Vererbung Ente quaken() schwimmen() anzeigen() fliegen() StockEnte anzeigen() MoorEnte anzeigen() GummiEnte anzeigen() quaken()
Interfaces Ente schwimmen() anzeigen() StockEnte anzeigen() fliegen() quaken() MoorEnte anzeigen() fliegen() quaken() GummiEnte anzeigen() quaken()  QuakFähig quaken() FlugFähig fliegen() LockEnte anzeigen()
Komposition FliegtMitFlügel fliegen() FliegtGarNicht fliegen() Quaken quaken()  QuakVerhalten quaken() Quietschen quaken() StummesQuaken quaken() FlugVerhalten fliegen()
Komposition GummiEnte MoorEnte Ente FlugVerhalten flugVerhalten QuakVerhalten quakVerhalten schwimmen() anzeigen() quakVerhalten =  new  Quaken() flugVerhalten =  new FliegtMitFlügel() quakVerhalten =  new  Quietschen() flugVerhalten =  new FliegtGarNicht()
http://flickr.com/photos/leecullivan/500201058/
Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung
Observer Subjekt Beobachter
Observer Subjekt Beobachter Registriere mich
Observer Subjekt Beobachter
Observer Observable addObserver() deleteObserver() notifyObservers() Sender getNachricht() <<InterFace>> Observer Update() Empfänger Update(); Anzeigen(); Empfänger Update(); Anzeigen();
Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung
Decorator preis() preis() preis() preis()
Decorator Getränk Beschreibung getBeschreibung() Preis() Hausmischung Preis() Espresso Preis() ZutatDekorierer getBeschreibung() Milch Getränk getränk Preis() getBeschreibung() Schokolade Getränk getränk Preis() getBeschreibung()
public class  Schokolade { //…. private double  preis() { return  0.40 + getraenk.preis; } //… } Decorator
Decorator Ausgabe:  „Kakao + Schokolade + Milch +    Schokolade“ Ausgabe:  „Kakao + DoppelSchokolade +  Milch“
Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Erweiterungen offen, aber für Veränderung geschlossen sein.
Factory
Factory Method Burger AktionsChickenBurger McPlusCity bestelleBurger() TeurerChickenBurger
bestelleBurger() { Burger  burger; if(aktionsZeitraum) burger = new AktionsChickenBurger(); else burger = new TeurerChickenBurger(); burger.grillen(); burger.einpacken(); return burger; } erstelleBurger()
Factory Method Burger AktionsChickenBurger McPlusCity bestelleBurger() erstelleBurger() TeurerChickenBurger
Factory Method Burger AktionsChickenBurger McPlusCity bestelleBurger() erstelleBurger() TeurerChickenBurger McFiliale bestelleBurger() reinigeFiliale()
Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Erweiterungen offen, aber für Veränderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen
Abstract Factory
 
Abstract Factory
Singleton Singleton Instance : Singleton Singleton() + getInstance(): Singleton
Singleton public class  Singleton { private static  SingleTon einzigeInstanz;   private   Singleton () {}   public   static  Singleton  getInstanz ()    { if (einzigeInstanz == null) { einzigeInstanz =  new   Singleton (); } return  einzigeInstanz; }   }
Singleton public class  Singleton { private static  SingleTon einzigeInstanz;   private   Singleton () {}   public   static  Singleton  getInstanz ()    { if (einzigeInstanz == null) { einzigeInstanz =  new   Singleton (); } return  einzigeInstanz; }   } Verzögerte Instantiierung
Singleton public class  Singleton { private static  SingleTon einzigeInstanz;   private   Singleton () {}   public   static   synchronized  Singleton  getInstanz ()    { if (einzigeInstanz == null) { einzigeInstanz =  new   Singleton (); } return  einzigeInstanz; }   }
Problem Multithreading public class  Singleton { private static  SingleTon einzigeInstanz =  new   Singleton();   private   Singleton () {}   public   static   synchronized  Singleton  getInstanz ()    { return  einzigeInstanz; }   } Verzögert    Vorzeitig
Problem Multithreading Zweifach geprüftes Sperren public  class  Singleton { private volatile static  SingleTon einzigeInstanz;   private   Singleton () {}   public   static   Singleton  getInstanz ()    { if ( einzigeInstanz == null) { synchronized  (  Singleton.class ) { if ( einzigeInstanz == null) { einzigeInstanz =  new   Singleton (); } } return  einzigeInstanz; }   }
Pattern in freier Wildbahn J2EE
J2EE-Beispiele Decorator new  BufferedReader (new  InputStreamReader ( System . in )); Session Facade Data Access Object
J2EE-Musterkatalog [SUN]
Zusammengesetze Muster
StockEnte quaken() QuakFähig quaken() LockPfeife quaken() GummiEnte quaken()
public class  EntenSimulator { //…. void  simulieren() { Quakfähig   stockEnte =  new  StockEnte(); Quakfähig  lockPfeife =  new  LockPfeife(); Quakfähig  gummiEnte =  new  GummiEnte(); simulieren(stockEnte); simulieren(lockPfeife); } void  simulieren (Quakfähig  ente) { ente.quaken(); } //… }
StockEnte quaken() QuakFähig quaken() LockPfeife quaken() GummiEnte quaken() Gans schnattern()
public class  GansAdapter implements  Quakfähig { Gans gans; //…. public void  quaken() { gans.schnattern(); } //… }
StockEnte quaken() QuakFähig quaken() LockPfeife quaken() GummiEnte quaken() GansAdapter quaken()
public class  EntenSimulator { //…. void  simulieren() { //…. Quakfähig  gummiEnte =  new  GummiEnte(); Quakfähig  gansEnte=  new  GansAdapter(new Gans()); simulieren(stockEnte); simulieren(gansEnte); } void  simulieren (Quakfähig  ente) { ente.quaken(); } //… }
public class  EntenSimulator { //…. void  simulieren() { //…. Quakfähig  gummiEnte =  new  GummiEnte(); Quakfähig  gansEnte=  new  GansAdapter(new Gans()); simulieren(stockEnte); simulieren(gansEnte); } void  simulieren (Quakfähig  ente) { ente.quaken(); } //… }
public class  Quakzähler implements  Quakfähig { Quakfähig  ente; int  anzahlDerQuaks; //…. public   void  quaken() { //…. ente.quaken(); anzahlDerQuaks++; } //… }
public class  EntenSimulator { //…. void  simulieren() { //…. Quakfähig  gummiEnte =  new  QuakZähler(new StockEnte()); Quakfähig  gansEnte=  new  GansAdapter(new Gans()); simulieren(stockEnte); simulieren(gansEnte); } void  simulieren (Quakfähig  ente) { ente.quaken(); } //… }
Adapter + Decorator +  Abstract Factory
Adapter + Decorator + Abstract Factory +  Composite
public class  Schar implements  Quakfähig { ArrayList  quakende = new  ArrayList () public   void  hinzufügen( Quakfähig  quaker) { quakende.add(quaker); } public   void  quaken() { Iterator iterator = quakende.iterator(); while( iterator.hasNext() ) { Quakfähig  quaker = ( Quakfähig )iterator.next(); quaker.quaken(); } } //… }
Adapter + Decorator + Abstract Factory + Composite + Iterator  +  Observer
Musterkataloge http://flickr.com/photos/northbaywanderer/121971249/
Design Pattern Wiederverwendbarkeit Entkoppeln / Trennen Vereinfachen / Aufteilen
 
ZUGABE? Noch mehr Pattern…
Command
Command http://de.wikipedia.org/wiki/Kommando_(Entwurfsmuster)
Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Ertweiterungen offen, aber für Verönderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen Sprechen Sie nur mit Ihren Freunden
Adapter Zwischenschalten einer Schicht Um Schnittstelle so anzupassen, dass sie ohne änderung übernommen werden kann
Facade Schnittstelle Vereinfachen / Schützen Weitere Funktion für Validierung, etc. Kommt in OptimalJ vor Gleicher Aufbau wie Adapter
Template Algorithmus Hooks
Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Ertweiterungen offen, aber für Verönderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen Sprechen Sie nur mit Ihren Freunden Versuchen Sie nicht uns anzurufen, wir rufen Sie an
Iterator Unabhängigkeit von der jeweiligen Collection-Implementierung
Composite Durchlaufen von “Bäumen” Rekursives Aufrufen
State Zustandsabhänige Elemente werden extrahiert
MOTORRAD Beispiel http://flickr.com/photos/neilw/192737187/
Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Ertweiterungen offen, aber für Verönderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen Sprechen Sie nur mit Ihren Freunden Versuchen Sie nicht uns anzurufen, wir rufen Sie an Eine Klasse sollte nur einen Grund haben, sich zu ändern
Proxy Zwischenschalten einer Schicht Aufbau gleich wie Adapter Zweck unterschiedlich
YES WE
Quellenverzeichnis [SUN] Alur, Crupi, Malks:  core J2EE Patterns. Sun Microsystems Press; Prentice  Hall; 2001. (deutsche Übersetzung von Frank Langenau; Markt+Technik  Verlag; 2002.)

Weitere ähnliche Inhalte

PPTX
Android Development ...and the daily challenges
PDF
Mvc public
KEY
Dependency injection
PDF
Livorno - Hafen der Medici
PPTX
Soft tissue tumor
PDF
50 Ways to Become More Professionally Excellent
PPTX
Asean quiz championship_2012
PDF
Data Modeling with Neo4j
Android Development ...and the daily challenges
Mvc public
Dependency injection
Livorno - Hafen der Medici
Soft tissue tumor
50 Ways to Become More Professionally Excellent
Asean quiz championship_2012
Data Modeling with Neo4j

Andere mochten auch (20)

PPT
Workshop Fahrstuhl-Pitch WoMenPower 2011 kathrin sebens
PPT
Gestion De Inventarios
PPTX
Tirol vorreiter e tourismus
PDF
Ejemplo-proyecto-completo-pmbok
PDF
Mythos und Wahrheit: Wikis für die Technische Dokumentation at tekom-Regional...
PDF
Ejemplos 1 análisis e interpretación de datos
PDF
Modelisation et maquettage 2015
PPTX
Operative instruments in Conservative Dentistry & Endodontics
PPTX
Banking in India
PPTX
Types of Irrigation
PDF
Assessment in Social work: A guide for learning and teaching
PDF
Workplace Accountability: How Effective Managers Create a Culture of Ownership
PPTX
Crm final ppt
PDF
Pollution And Human Health
PPT
isolation
PDF
Introducing Apple Watch
PPTX
Women empowerment
PDF
Html / CSS Presentation
PDF
Thai tech startup ecosystem report 2017
PDF
Best Practices for Pitching to Judges - Startup Weekend Doha 2016
Workshop Fahrstuhl-Pitch WoMenPower 2011 kathrin sebens
Gestion De Inventarios
Tirol vorreiter e tourismus
Ejemplo-proyecto-completo-pmbok
Mythos und Wahrheit: Wikis für die Technische Dokumentation at tekom-Regional...
Ejemplos 1 análisis e interpretación de datos
Modelisation et maquettage 2015
Operative instruments in Conservative Dentistry & Endodontics
Banking in India
Types of Irrigation
Assessment in Social work: A guide for learning and teaching
Workplace Accountability: How Effective Managers Create a Culture of Ownership
Crm final ppt
Pollution And Human Health
isolation
Introducing Apple Watch
Women empowerment
Html / CSS Presentation
Thai tech startup ecosystem report 2017
Best Practices for Pitching to Judges - Startup Weekend Doha 2016
Anzeige

Ähnlich wie Java Design Pattern (20)

PDF
Go - Googles Sprache für skalierbare Systeme
PDF
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
PDF
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
PDF
Mögen die Tests mit dir sein
PPT
2009 03 17 Spring101
PPTX
TypeScript
PDF
Scalaz introduction for Java programmers
PDF
Feige sein! Testen im Java-EE-Umfeld
PPT
Workshop zu Hibernate 3.2.2 GA
PDF
Funktionales Programmieren mit Clojure
PDF
Warum ECMAScript 6 die Welt ein Stückchen besser macht
PDF
Mehr Dynamik Durch Skriptsprachen
PDF
Funktionale Programmierung mit Java - Andreas Jürgensen
PDF
Testen im EE-Umfeld – Seien Sie feige!
PPTX
TypeScript
PDF
JavaScript Performance
ODP
ODP
PPTX
Kata - Java - Tests - JUnit 4
PPTX
Scala und Lift
Go - Googles Sprache für skalierbare Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Mögen die Tests mit dir sein
2009 03 17 Spring101
TypeScript
Scalaz introduction for Java programmers
Feige sein! Testen im Java-EE-Umfeld
Workshop zu Hibernate 3.2.2 GA
Funktionales Programmieren mit Clojure
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Mehr Dynamik Durch Skriptsprachen
Funktionale Programmierung mit Java - Andreas Jürgensen
Testen im EE-Umfeld – Seien Sie feige!
TypeScript
JavaScript Performance
Kata - Java - Tests - JUnit 4
Scala und Lift
Anzeige

Java Design Pattern

  • 1. Design Pattern Teil 2 Ein etwas strukturierterer Ansatz http://flickr.com/photos/kingdesmond/477389196/
  • 2.  
  • 4. Creational Pattern http://flickr.com/photos/factoryjoe/204497604/
  • 5. Structural Pattern http://flickr.com/photos/factoryjoe/204497604/ Creational
  • 6. Behavioral Pattern http://flickr.com/photos/factoryjoe/204497604/ Creational Structural
  • 9. Grundlegendes Basiswissen OOP Normale Klasse Abstrakte Klasse Interface
  • 10. Grundlegendes Basiswissen OOP Normale Klasse Abstrakte Klasse Interface Beziehungen Is-A (Inheritance) Has-A (Composition) Can-Do (Interfaces)
  • 11. Vererbung Ente quaken() schwimmen() anzeigen() fliegen() StockEnte anzeigen() MoorEnte anzeigen() GummiEnte anzeigen() quaken()
  • 12. Vererbung Ente quaken() schwimmen() anzeigen() fliegen() StockEnte anzeigen() MoorEnte anzeigen() GummiEnte anzeigen() quaken()
  • 13. Interfaces Ente schwimmen() anzeigen() StockEnte anzeigen() fliegen() quaken() MoorEnte anzeigen() fliegen() quaken() GummiEnte anzeigen() quaken() QuakFähig quaken() FlugFähig fliegen() LockEnte anzeigen()
  • 14. Komposition FliegtMitFlügel fliegen() FliegtGarNicht fliegen() Quaken quaken() QuakVerhalten quaken() Quietschen quaken() StummesQuaken quaken() FlugVerhalten fliegen()
  • 15. Komposition GummiEnte MoorEnte Ente FlugVerhalten flugVerhalten QuakVerhalten quakVerhalten schwimmen() anzeigen() quakVerhalten = new Quaken() flugVerhalten = new FliegtMitFlügel() quakVerhalten = new Quietschen() flugVerhalten = new FliegtGarNicht()
  • 17. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung
  • 19. Observer Subjekt Beobachter Registriere mich
  • 21. Observer Observable addObserver() deleteObserver() notifyObservers() Sender getNachricht() <<InterFace>> Observer Update() Empfänger Update(); Anzeigen(); Empfänger Update(); Anzeigen();
  • 22. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung
  • 23. Decorator preis() preis() preis() preis()
  • 24. Decorator Getränk Beschreibung getBeschreibung() Preis() Hausmischung Preis() Espresso Preis() ZutatDekorierer getBeschreibung() Milch Getränk getränk Preis() getBeschreibung() Schokolade Getränk getränk Preis() getBeschreibung()
  • 25. public class Schokolade { //…. private double preis() { return 0.40 + getraenk.preis; } //… } Decorator
  • 26. Decorator Ausgabe: „Kakao + Schokolade + Milch + Schokolade“ Ausgabe: „Kakao + DoppelSchokolade + Milch“
  • 27. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Erweiterungen offen, aber für Veränderung geschlossen sein.
  • 29. Factory Method Burger AktionsChickenBurger McPlusCity bestelleBurger() TeurerChickenBurger
  • 30. bestelleBurger() { Burger burger; if(aktionsZeitraum) burger = new AktionsChickenBurger(); else burger = new TeurerChickenBurger(); burger.grillen(); burger.einpacken(); return burger; } erstelleBurger()
  • 31. Factory Method Burger AktionsChickenBurger McPlusCity bestelleBurger() erstelleBurger() TeurerChickenBurger
  • 32. Factory Method Burger AktionsChickenBurger McPlusCity bestelleBurger() erstelleBurger() TeurerChickenBurger McFiliale bestelleBurger() reinigeFiliale()
  • 33. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Erweiterungen offen, aber für Veränderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen
  • 35.  
  • 37. Singleton Singleton Instance : Singleton Singleton() + getInstance(): Singleton
  • 38. Singleton public class Singleton { private static SingleTon einzigeInstanz;   private Singleton () {}   public static Singleton getInstanz () { if (einzigeInstanz == null) { einzigeInstanz = new Singleton (); } return einzigeInstanz; }   }
  • 39. Singleton public class Singleton { private static SingleTon einzigeInstanz;   private Singleton () {}   public static Singleton getInstanz () { if (einzigeInstanz == null) { einzigeInstanz = new Singleton (); } return einzigeInstanz; }   } Verzögerte Instantiierung
  • 40. Singleton public class Singleton { private static SingleTon einzigeInstanz;   private Singleton () {}   public static synchronized Singleton getInstanz () { if (einzigeInstanz == null) { einzigeInstanz = new Singleton (); } return einzigeInstanz; }   }
  • 41. Problem Multithreading public class Singleton { private static SingleTon einzigeInstanz = new Singleton();   private Singleton () {}   public static synchronized Singleton getInstanz () { return einzigeInstanz; }   } Verzögert  Vorzeitig
  • 42. Problem Multithreading Zweifach geprüftes Sperren public class Singleton { private volatile static SingleTon einzigeInstanz;   private Singleton () {}   public static Singleton getInstanz () { if ( einzigeInstanz == null) { synchronized ( Singleton.class ) { if ( einzigeInstanz == null) { einzigeInstanz = new Singleton (); } } return einzigeInstanz; }   }
  • 43. Pattern in freier Wildbahn J2EE
  • 44. J2EE-Beispiele Decorator new BufferedReader (new InputStreamReader ( System . in )); Session Facade Data Access Object
  • 47. StockEnte quaken() QuakFähig quaken() LockPfeife quaken() GummiEnte quaken()
  • 48. public class EntenSimulator { //…. void simulieren() { Quakfähig stockEnte = new StockEnte(); Quakfähig lockPfeife = new LockPfeife(); Quakfähig gummiEnte = new GummiEnte(); simulieren(stockEnte); simulieren(lockPfeife); } void simulieren (Quakfähig ente) { ente.quaken(); } //… }
  • 49. StockEnte quaken() QuakFähig quaken() LockPfeife quaken() GummiEnte quaken() Gans schnattern()
  • 50. public class GansAdapter implements Quakfähig { Gans gans; //…. public void quaken() { gans.schnattern(); } //… }
  • 51. StockEnte quaken() QuakFähig quaken() LockPfeife quaken() GummiEnte quaken() GansAdapter quaken()
  • 52. public class EntenSimulator { //…. void simulieren() { //…. Quakfähig gummiEnte = new GummiEnte(); Quakfähig gansEnte= new GansAdapter(new Gans()); simulieren(stockEnte); simulieren(gansEnte); } void simulieren (Quakfähig ente) { ente.quaken(); } //… }
  • 53. public class EntenSimulator { //…. void simulieren() { //…. Quakfähig gummiEnte = new GummiEnte(); Quakfähig gansEnte= new GansAdapter(new Gans()); simulieren(stockEnte); simulieren(gansEnte); } void simulieren (Quakfähig ente) { ente.quaken(); } //… }
  • 54. public class Quakzähler implements Quakfähig { Quakfähig ente; int anzahlDerQuaks; //…. public void quaken() { //…. ente.quaken(); anzahlDerQuaks++; } //… }
  • 55. public class EntenSimulator { //…. void simulieren() { //…. Quakfähig gummiEnte = new QuakZähler(new StockEnte()); Quakfähig gansEnte= new GansAdapter(new Gans()); simulieren(stockEnte); simulieren(gansEnte); } void simulieren (Quakfähig ente) { ente.quaken(); } //… }
  • 56. Adapter + Decorator + Abstract Factory
  • 57. Adapter + Decorator + Abstract Factory + Composite
  • 58. public class Schar implements Quakfähig { ArrayList quakende = new ArrayList () public void hinzufügen( Quakfähig quaker) { quakende.add(quaker); } public void quaken() { Iterator iterator = quakende.iterator(); while( iterator.hasNext() ) { Quakfähig quaker = ( Quakfähig )iterator.next(); quaker.quaken(); } } //… }
  • 59. Adapter + Decorator + Abstract Factory + Composite + Iterator + Observer
  • 61. Design Pattern Wiederverwendbarkeit Entkoppeln / Trennen Vereinfachen / Aufteilen
  • 62.  
  • 63. ZUGABE? Noch mehr Pattern…
  • 66. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Ertweiterungen offen, aber für Verönderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen Sprechen Sie nur mit Ihren Freunden
  • 67. Adapter Zwischenschalten einer Schicht Um Schnittstelle so anzupassen, dass sie ohne änderung übernommen werden kann
  • 68. Facade Schnittstelle Vereinfachen / Schützen Weitere Funktion für Validierung, etc. Kommt in OptimalJ vor Gleicher Aufbau wie Adapter
  • 70. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Ertweiterungen offen, aber für Verönderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen Sprechen Sie nur mit Ihren Freunden Versuchen Sie nicht uns anzurufen, wir rufen Sie an
  • 71. Iterator Unabhängigkeit von der jeweiligen Collection-Implementierung
  • 72. Composite Durchlaufen von “Bäumen” Rekursives Aufrufen
  • 73. State Zustandsabhänige Elemente werden extrahiert
  • 75. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Ertweiterungen offen, aber für Verönderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen Sprechen Sie nur mit Ihren Freunden Versuchen Sie nicht uns anzurufen, wir rufen Sie an Eine Klasse sollte nur einen Grund haben, sich zu ändern
  • 76. Proxy Zwischenschalten einer Schicht Aufbau gleich wie Adapter Zweck unterschiedlich
  • 78. Quellenverzeichnis [SUN] Alur, Crupi, Malks: core J2EE Patterns. Sun Microsystems Press; Prentice Hall; 2001. (deutsche Übersetzung von Frank Langenau; Markt+Technik Verlag; 2002.)

Hinweis der Redaktion

  • #61: Musterkataloge
  • #66: Vorteile Auslösender und Ausführender sind entkoppelt. Befehlsobjekte können wie andere Objekte auch manipuliert werden. (Verändern, Filtern, Zwischenspeichern, ... ) Befehlsobjekte können zu komplexen Befehlen kombiniert werden ( Makros , realisiert als Kompositum ) Nachteile Es wird für jedes Kommando eine neue Klasse benötigt. Dies kann sehr schnell zu einer großen Menge von Klassen führen. Beispiel Ein gutes Beispiel für das Befehlsmuster, ist die Verknüpfung von GUI -Elementen, wie Schaltflächen oder Menüpunkten , mit den entsprechenden Aktionen: Konkrete Befehle realisieren dann Aktionen wie Datei öffnen , Rückgängig oder Schreibmarke nach rechts Klienten sind die Applikation oder Dialoge. Aufrufer sind Schaltflächen, Menüpunkte oder Hotkeys . Empfänger sind die Applikation ( Datei öffnen ) oder das Dokument ( Rückgängig , Einfügemarke nach rechts )